MCBC-mac-to-SELinux: конвертер файловых мандатных меток МСВС в SELinux
Программа MCBC-mac-to-SELinux, также известная как mcbc2selinux, предназначена для преобразования мандатной метки на файл или каталог из формата МСВС 3.0 в формат SELinux.
Применяется в операционных системах семейства ROSA, в т.ч. РОСА Никель (ROSA Nickel) (далее — Роса) платформ rosa2019.05, rosa2021.1 и новее.
Производится изменение мандатных аттрибутов доступа SELinux в расширенном аттрибуте файловой системы (xattr) security.selinux на основе мандатных аттрибутов из МСВС, записанных в xattr user.MCBC_mac.
Предполагается, что запись значения xattr user.MCBC_mac производится программой распаковки tar-архива, упакованного на МСВС путем запуска tar --msec. В Росе библиотека libarchive научена это делать с помощью патча, а значит для распаковки можно использовать графические архиваторы Ark, file-roller и другие и консольный bsdtar; пример распаковки: bsdtar -xvf Documents-MCBC.tar
Способ и параметры запуска программы
Использование:
mcbc2selinux "путь к файлу"
Пример:
mcbc2selinux "/home/secuser/Документы/Доклад руководителю.odt"
Запуск конвертера для всех файлов и каталогов в /home:
find /home -print -exec mcbc2selinux '{}' ';'
Код возврата:
0 в случае успешного преобразования метки SELinux,
не 0 в случае возникновения ошибок.
Программа конвертирования меток mcbc2selinux понимает следующие переменные окружения:
MCBC_CONVERTOR_DEBUG — вывод подробной информации о происходящих преобразованиях, переменная может иметь любое значение, если она установлена, то включается вывод отладочных сообщений;
MCBC_CONVERTOR_DELTA_S — число, прибавляемое к результирующему уровню секретности s, может иметь в качестве значения любое целое число, положительное или отрицательное;
MCBC_CONVERTOR_DELTA_C — число, прибавляемое к результирующему обозначению категории c, может иметь в качестве значения любое целое число, положительное или отрицательное.
Пример установки переменных окружения перед запуском конвертера:
export MCBC_CONVERTOR_DEBUG=1 # включает вывод отладочных сообщений
export MCBC_CONVERTOR_DELTA_S=1 # уровень 2 из МСВС будет преобразован в s3 вместо s2
export MCBC_CONVERTOR_DELTA_C=-1 # категория 2 из МСВС будет преобразована в c1 вместо c2
Теоретическая информация
Метка SELinux имеет следующий вид:
user_u:object_r:home_t:s2:c1
Она состоит из информации о контроле доступа по ролям (RBAC), а в конце идут мандатные аттрибуты:
- уровень секретности
s
- категории доступа
c
Могут быть указаны диапазоны s и/или c, однако диапазоны не поддержимваются в МСВС 3.0, поэтому в данном случае не рассматриваем их.
Метки SELinux хранятся в расширенных аттрибутах файловой системы (далее — xattr), а именно — в аттрибуте security.selinux.
В МСВС xattr не используются для хранения меток, в связи с чем невозможно их перенести на систему в SELinux путем подключения к ней дискового накопителя с файловой системой от МСВС.
Однако встроенная в МСВС программа-архиватор tar умеет записывать мандатные метки в заголовок тарболла MCBC.mac.
Это позволяет использовать программу tar для переноса информации с сохранением меток конфиденциальности.
Заголовки MCBC.mac упакованных на МСВС тарболлов имеют следующий вид:
MCBC.mac=02,0000000000000001,00000000
В первой части (после знака равенства и до первой запятой) идет числовое обозначение уровня конфиденциальности, которых в МСВС 3.0 можно создать до 8 штук, отсчет начинается с 00 и заканчивается на 07.
Во второй части (от первой до второй запятой) идет закодированное в 16-ричной системе счисления значение категории, которое при переводе в десятичную систему счисления может иметь значения от 0 до 61.
В третьей части (от второй запятой и до конца) идет информация об аудите, которая не имеет прямого аналога в SELinux и в данном случае не интересна.
При распаковке такого тарболла на Роса с помощью библиотеки libarchive, которую используют консольная программа basdtar и графическая программа Ark, производится копирование значения заголовка MCBC.mac для каждого элемента тарболла в xattr user.MCBC_mac внутри файловой системы Росы. Файловая система, на которую производится распаковка, должна поддерживать расширенные аттрибуты. Используемая по умолчанию при установке ОС файловая система ext4 поддерживает их, включать их отдельно для неё не требуется.
После распаковки такого тарболла запускается программа MCBC-mac-to-SELinux (mcbc2selinux), которая преобразовывает уровни безопасности s и c в метке SELinux в значения из метки от МСВС, не изменяя остальные части метки SELinux.
Мандатная метка от МСВС продолжает храниться в xattr user.MCBC_mac и технически доступна для чтения и изменения пользователями, у которых есть права на чтение и изменение файла с ней, что позволяет пользователю с правами на запись в файл изменить, в т.ч. понизить, записанный в этой метке уровень доступа. При необходимости аттрибут user.MCBC_mac может быть удален, а может быть оставлен для возможности выполнить преобразование s и c в метке SELinux в соответствии с его значением повторно. На работу мандатной системы Росы значение xattr user.MCBC_mac не влияет, поэтому изменение его значения пользователем не влияет на уровни доступа к файлу до тех пор, пока конвертер меток не будет запущен снова (а его работа также подчиняется мандатной системе, например, он не сможет понизить уровень секретности файла).
И в Росе, и в МСВС уровни конфиденциальности и категории с точки зрения систем мандатного разграничения доступа являются лишь числами.
Этим числам могут быть присвоены словесные обозначения, например, «Секретно», однако администраторы системы имеют техническую возможность менять эти обозначения.
По умолчанию числовые обозначения уровней секретности в МСВС на 1 отстают от Росы. Посмотрим на этот скриншот из МСВС:

На нем видно, что у уровня «Совершенно секретно» цифровое обозначение 2, у «Секретно» — 1. Посмотрим на еще один скриншот из МСВС:

На нем видно, что категория, которую по инструкции ниже создали, указав бит 1, обозначается цифрой 2.
В Росе словесные обозначения уровней секретности заданы в файле /etc/selinux/mls/setrans.conf:

Изображение ниже показывает, что у в упакованном в МСВС архиве tar у файлов из каталога 2-0 стоит уровень 2 и категория 0:

Конвертер с настройками по умолчанию преобразует уровень 2 «Совершенно секретно» из МСВС в уровень s2 «Секретно» из SELinux!
В связи с этим перед началом переноса информации из информационной системы на базе МСВС в систему на базе РОСА Никель необходимо согласовать схему соответствий уровней конфиденциальности и категорий.
Возможно как соответствие один в один (уровень 1 в МСВС преобразовывается в уровень s1 в Росе, категория 1 в МСВС преобразовывается в категорию 1 в Росе), так и применение заданных отклонений (дельт) для s и/или c.
Согласование методики проецирования уровней безопасности выполняется административно и не входит в сферу действия данного руководства.
Процесс переноса данных можно разделить на следующие этапы:
- Упаковка архива tar на МСВС
- Перенос архива на Росу
- Распаковка архива на Росе
- Запуск программы
mcbc2selinux для каждого файла или каталога на Росе для конвертирования меток из МСВС в SELinux
Ниже в качестве примера описана предлагаемая последовательность действий. Для переноса архива используется USB флеш-накопитель, описанная процедура нацелена на предотвращение утечки информации. При необходимости перенос архива может быть выполнен иным способом: на оптическом диске, передачей по сети и др.
Программная методика испытаний (контрольный пример)
Упаковка и запись файлов на МСВС 3.0
Необходимо установить и запустить ОС МСВС 3.0.
Теперь нужно создать пользователя с доступом к секретными уровнями и создать под ними «секретные» файлы, для этого:
- Входим под root в tty
- Выполняем:
useradd secuser
- Выполняем:
passwd secuser, задаем пароль
- Выполняем:
pkill elk-dm
- Выполняем:
pkill X
- Выполняем:
elk-dm
- Отрывается графическое окно входа в систему, входим под root:

- В меню «Пуск» последовательно выбираем: Настройка -> Панель управления ELK

- В открывшемся окне Панели управления ELK выбираем: Безопасность -> Уровни и категории
- В открывшемся окне переходим на вкладку «Категории»
- Нажимаем кнопку «Добавить»:

- Открывается окно, предлагающая выбрать «Уникальная» или «Агрегатная», выбираем «Уникальная»:

- Задаем имя категории: «category1», бит 1, нажимаем «Принять»:

- Нажимаем «Применить»
- Нажимаем «Выход»
- В окне Панели управления ELK выбираем: Безопасность -> Пользователи
- В открывшемся окне программы управления пользователями находим пользователя «secuser», нажимаем на него 2 раза левой кнопкой мыши, отрывается окно «Свойства пользователя»
- В открывшемся окне переходим на вкладку «Категории»
- Переходим на вкладку «Безопасность», выставляем минимальный уровень «Несекретно», а максимальный — «Совершенно_секретно»
- Нажимаем на кнопку «Изменить» в разделе «Категории»:

- Слева вверху нажимаем 1 раз левой кнопкой мыши на слово «category1», нажимаем на стрелку вправа, затем на «Да», последовательность нажатия кнопок показана ниже:

- Нажимаем «Да», окно «Свойства пользователя» закрывается
- В основном окне в верхнем меню выбираем: Файл -> Сохранить
- Перезагружаем систему (или из tty делаем:
pkill elk-dm)
- Попадаем в графический экран входа в систему любым способом, в т.ч. описанным выше
- Входим под пользователем «secuser»
- Нажимаем правой кнопкой мыши на значок с обозначением уровня секретности в трее и выбираем: Уровень -> Совершенно_секретно:

- Нажимаем правой кнопкой мыши на значок с обозначением уровня секретности в трее и выбираем: Категория -> 0
- Нажимаем на значок домашней папки справа от кнопки «Пуск»:

- Заходим в каталог «Мои документы» («Documents») -> «Уровень 2-0»:

- Нажимаем правой кнопкой мыши в свободное место в файловом менеджере, выбираем: Создать-> Текстовый файл:

- Указываем имя файла:
secret2-0.txt и нажимаем «Да»:

- Нажимаем 2 раза левой кнопкой мыши на созданный файл
- В появившемся окне текстового редактора Kate нажимаем «Открыть сеанс»:

- Открывается текстовый редактор, добавляем в этот файл текст:
secret2-0

- В текстовом редакторе нажимаем: Файл -> Сохранить
- Закрываем окно текстового редактора
- Если появился файл «secret2-0.txt~», то нажимаем на него 1 раз левой кнопкой мыши для выделения, нажимаем комбинацию клавиш Shift+Delete, нажимаем «Да»:

- Закрываем файловый менеджер
- В трее выбираем Уровень «Секретно», Категория category1
- Открываем Файловый менеджер, Мои документы -> «Уровень 1-2»:

- Нажимаем правой кнопкой мыши в свободное место в файловом менеджере, выбираем: Создать-> Текстовый файл
- Указываем имя файла:
secret1-2.txt и нажимаем «Да»
- Нажимаем 2 раза левой кнопкой мыши на созданный файл
- В появившемся окне текстового редактора Kate нажимаем «Открыть сеанс»
- Открывается текстовый редактор, добавляем в этот файл текст:
secret1-2
- Если появился файл «secret1-2.txt~», то нажимаем на него 1 раз левой кнопкой мыши для выделения, нажимаем комбинацию клавиш Shift+Delete, нажимаем «Да»
- Возвращаемся в текстовую консоль root (можно перезагрузить систему, если так будет удобнее в нее вернуться)
- Выполняем:
ls -laM /home/secuser/Documents
В выводе этой команды видим метки конфиденциальности, как на изображении:

- Выполняем:
tar --msec -cvf /root/Documents-MCBC.tar -C /home/secuser/Documents .

Файл /root/Documents-MCBC.tar является готовым для переноса в Росу архивом.
- Выключите систему
- Подключите съемное устройство (USB флеш-какопитель) к машине с МСВС; в случае использования виртуализации через virt-manager можно пробросить USB-устройство с хоста:

- Запускаем МСВС
- Входим в текстовую консоль под root
- Выполняем:
dmesg && fdisk -l
В конце вывода dmesg будет написано обозначение, присвоенное накопителю, оно же будет в выводе fdisk, например, sdx, т.е. блочное устройство /dev/sdx, что будет использовано в этой инструкции для примера. На изображении показан пример, где съемное устройство имеет обозначение sda

Далее по текству инструкции будет использоваться обозначение sdx, его необходимо заменять на своё.
- Выполним стирание таблицы разделов накопителя:
dd if=/dev/zero of=/dev/sdx bs=3M count=1
- Перезагрузим систему командой
reboot
- Входим в текстовую консоль под root
- В выводе
fdisk -l убедимся, что накопитель имеет прежнее буквенное значение, если нет, то узнаем его новое значение и подставим его вместо sdx в дальнейших шагах
- Создадим файловую систему на накопителе:
mkfs.ext3 /dev/sdx, на вопрос ответим вводом: «y», — и нажатием Enter (Ввод)
(обратите внимание, если накопитель проброшен в виртуальную машину, доступ к нему может быть медленным, из-за чего mkfs.ext3 может работать аномально долго)

- Выполним:
mkdir -p /mnt/disk
- Выполним:
mount /dev/sda /mnt/disk
- Выполним:
cp -v /root/Documents-MCBC.tar /mnt/disk
- Выполним:
chmod 777 /mnt/disk/Documents-MCBC.tar
- Выполним:
sync
- Выполним:
umount /mnt/disk

- Извлекаем съемное устройство и при необходимости выключаем МСВС командой
poweroff (если накопитель проброшен в виртуальную машину, то выключаем виртуальную машину и отключаем его проброс)
Необходимо обеспечить административными и при необходимиости иными мерами неиспользование данного носителя информации вне целевой системы для переноса информации.
Перенос файлов на РОСА Никель
Устанавливаем и запускаем ОС РОСА Никель и выполняем описанные ниже действия.
- Подключаем съемный носитель к Росе
- Включаем Росу
- Вводим указанное при установке имя пользователя и заданый там же пароль:

- Нажимаем на кнопку с зеленым щитом и убеждаемся, что уровень секретности не выбран:

- Нажимаем «ОК»
- Нажимаем кнопку со значком зеленого треугольника для выполнения входа в систему
- Видим экран загрузки графической оболочки, ожидаем ее загрузки:

- Дожидаемся окончания работы программы «ROSA Security Test», неуспешная проверка механизма подписей нормальна, т.к. IMA не была настроена, нажимаем «Выход»:

- Нажимаем на кнопку с зеленым щитом на нижней панели, открывается информация о текущей сессии и ее контексте безопасности:

Если вход выполняется не под созданным при установке пользователем, контекст безопасности должен быть таким же: пользователь SELinux aib_u, роль sysadm_r, тип sysadm_t. ТАкже пользователь должен состоять в группе wheel (либо придется выполнять распаковку архива от root иным способом, чем описано в данной инструкции).
- Запускаем графическую программу «Управление SELinux»:

- Вводим пароль и нажимаем «ОК»:

- Нажимаем 2 раза левой кнопкой мыши на пользователя, который был создан при установке системы (на скриншоте ниже это пользователь «user»)
- В появившемся окне задаем значение поля «Диапазон MLS/MCS» в соответствии с максимальными уровнями доступа к переносимой из МСВС информации в пересчете на уровни доступа к ним в системе SELinux в Росе;
пример значения поля: s0-s3:c0.c2

В этом значении поля s0 — это минимальный возможный уровень секретности для данного пользователя, s3 — максимально возможный, знак дефиса между урвонями означает диапазон, т.е. при таком значении поля пользователь сможет выбрать на экране входа в систему уровни s0, s1, s2 и s3.
После двоеточия указываются доступные пользователю категории доступа. Знак точки означает диапазон.
Максимальное значение категории (c) рекомендуется установить на 1 больше максимального значения по результатам конвертирования меток из МСВС.
Далее будет выполнен вход в систему под максимальным уровнем доступа s и любой неиспользуемой в результате преобразований категорией, для чего выше была дана рекомендация сделать запасную категорию. При распаковке файлов на них будет автоматически установлен уровень доступа, эквивалентный следующему словесному описанию: доступ возможен только с уровня секретности s большего или равного уровню s у сессии пользователя в момент распаковки и только под категорией, равной категории сессии пользователя в момент распаковки. Получится, что конвертер меток сможет понизить уровни доступа, но, если в следствие машинных или человеческих ошибок преобразования каких-либо уровней доступа не будут выполнены, утечки информации не произойдет.
Приведенное значение s0-s3:c0.c2 соответствует этому требованию для распаковки информации, созданной и упакованной в соответствии с этой инструкцией.
- Нажимаем «ОК» и закрываем программу «Управление SELinux».
- Запускаем программу «ROSA Removable Drive Manager»

- Вводим пароль и нажимаем «ОК»:

- Нажимаем кнопку «Добавить»
- В графе «Наименование» выбираем подключенный съемный носитель информации

- Значение остальных полей не изменяем, нажимаем «Добавить»
- Закрываем программу «ROSA Removable Drive Manager»
- Перезагружаем систему
- При включении в меню загрузчика Grub с помощью клавиш со стрелками вверх и вниз выбираем нужный пункт меню, например, первый пункт (выбран по умолчанию) и нажимаем клавишу с латинской буквой E

- Вводим имя пользователя: «root», нажимаем клавишу Enter (Ввод)
- Вводим пароль root, заданный при установке (при вводе не отображается), нажимаем клавишу Enter (Ввод)

- В открывшемся текстовом редакторе с помощью клавиш со стрелками вверх, вниз, вправо, влево переводим курсор ввода текста в конец строки, начинающейся со слова «linux», и дописываем в ее конец: «enforcing=0»:

- Нажимаем одновременно клавиши Ctrl и X (латинскую) или клавишу F10 для загрузки системы с измененными параметрами. Это запустит ОС с SELinux в режиме permissive, мандатные разграничения доступа будут отключены, что позволит программе конвертирования меток изменять уровни доступа.
- Вводим имя пользователя
- Нажимаем на кнопку с зеленым щитом и в выпадающем списке выбираем контекст безопасности с максимальными значениями s и c:

- Нажимаем «ОК»
- Вводим пароль
- Нажимаем на кнопку с зеленым треугольником или клавишу Enter (Ввод)
- Открываем содержимое съемного накопителя в файловом менеджере
- Нажимаем клавишу F4, находяся в файловом менеджере, открывается встроенная консоль
- В этой консоли выполняем:
sudo bsdtar -xvf Documents-MCBC.tar ~, вводим пароль пользователя, нажимаем Enter (Ввод):

В результате успешной распаковки архива должен быть выведен список файлов в нем.
- Переходим в домашнюю папку в файловом менеджере путем нажатия на пункт «Домашняя папка» в разделе «Точки входа» или иным способом
- Видим извлеченное из архива содержимое — каталоги «1-2» и «2-0»
- Выполняем команду:
xattr -l 1-2, которая выводит все расширенные аттрибуты каталога «1-2»:

Видим, что имеются расширенные аттрибуты «security.selinux» и «user.MCBC_mac». Задачей программы конвертирования меток будет заменить «s2:c2» в security.selinux на значения, рассчитанные на основе значения user.MCBC_mac.
- Выполняем:
find ?-? -print -exec mcbc2selinux '{}' ';'
В выводе этой команды перечислены файлы и каталоги, мандатные аттрибуты SELinux которых были конвертированы в соотвествии с перенесенными из МСВС мандатными аттрибутами. Никаких других сообщений не должно быть.

- Снова смотрим значения расширенных аттрибутов, выполнив:
xattr -l 1-2:

Видим, что «s3:c2» в метке SELinux было успешно заменено на «s1:c2».
- Теперь проверим работу конвертера с заданными дельтами, для этого выполним:
export MCBC_CONVERTOR_DELTA_S=1
find ?-? -print -exec mcbc2selinux '{}' ';'

В выводе последней команды перечислены файлы и каталоги, мандатные аттрибуты SELinux которых были конвертированы в соотвествии с перенесенными из МСВС мандатными аттрибутами. Никаких других сообщений не должно быть.
- Выполним:
xattr -l 1-2

Видим, что теперь мандатным аттрибутом SELinux является «s2:c2», а не «s1:c2», как при запуске конвертера без переменной окружения MCBC_CONVERTOR_DELTA_S=1.
- Выключаем систему
- Отключаем съемный носитель
- Включаем систему (изменять параметры запуска не нужно)
- Вводим имя пользователя
- Нажимаем на кнопку с зеленым щитом и в выпадающем списке выбираем контекст безопасности «s2:c2»:

- Нажимаем «ОК»
- Вводим пароль
- Нажимаем на кнопку с зеленым треугольником или клавишу Enter (Ввод)
- Открываем файловый менеджер, домашнюю папку, видим каталоги «1-2» и «2-0»:

- Открываем каталог «1-2», видим его содержимое, открываем находящийся в нем файл «secret1-2.txt», видим его содержимое
- Возвращаемся в домашнюю папку, пробуем открыть каталог «2-0», видим пустоту (не видим находящихся в нем файлов):

- Завершаем сеанс:

- Вводим имя пользователя
- Нажимаем на кнопку с зеленым щитом и в выпадающем списке выбираем контекст безопасности «s3:c0»
- Нажимаем «ОК»
- Вводим пароль
- Нажимаем на кнопку с зеленым треугольником или клавишу Enter (Ввод)
- Открываем файловый менеджер, домашнюю папку, видим каталоги «1-2» и «2-0»
- Открываем каталог «1-2» и видим пустоту (не видим находящихся в нем файлов):

- Возвращаемся в домашнюю папку, открываем каталог «2-0», открываем находящийся в нем файл «secret2-0.txt» и видим его содержимое:

Таким образом, был продемонстрирован успешный перенос информации из МСВС с сохранением мандатных аттрибутов доступа.
Обратите внимание, что названия каталогов «1-2» и «2-0» обозначают исходные уровни доступа в МСВС и не являются объектами мандатной защиты. При работе со включенной мандатной защитой в Росе нельзя создать каталог, название которого было бы видно на более низком уровне доступа или в иной категории, в данном случае это было сделано при выключенной мандатной защите.