Содержание

Проблема с рекурсивной сменой мандатной метки файлах и директориях


Суть проблемы


В ОССН Astra Linux релиз Смоленск (далее ОССН) начиная с версии 1.4 и позднее не возможна рекурсивная смена мандатной метки на поддереве файловой системы. Проще говоря, проблема возникает при попытке сменить метку на непустой директории. Пример:

root@dcm14:~# # Корень файловой системы имеет максимальную метку
root@dcm14:~# # А также специальный флаг - ccnr, позволяющий записывать в корень файлы с меткой >= макстимальной
root@dcm14:~# pdp-ls -Md /
drwxr-xr-xm 30 root root Уровень_3:Низкий:0xffffffffffffffff:CCNRALL /
root@dcm14:~# # Создадим в корне файловой системы новую директорию
root@dcm14:~# mkdir /mydir0
root@dcm14:~# # Метка директории - нулевая
root@dcm14:~# pdp-ls -Md /mydir0
drwxr-xr-x 2 root root Уровень_0:Низкий:Нет:0x0 /mydir0
root@dcm14:~# # Поменяем метку на 1:0:0:0
root@dcm14:~# pdp-flbl 1:0:0:0 /mydir0
root@dcm14:~# # Это возможно, благодаря флагу ccnr родительской директории - /
root@dcm14:~# pdp-ls -Md /mydir0
drwxr-xr-xm 2 root root Уровень_1:Низкий:Нет:0x0 /mydir0
root@dcm14:~# # Теперь создадим ещё одну директорию и запишем в неё файл.
root@dcm14:~# mkdir /mydir1 && touch /mydir1/file
root@dcm14:~# pdp-ls -Md /mydir1
drwxr-xr-x 2 root root Уровень_0:Низкий:Нет:0x0 /mydir1
root@dcm14:~# pdp-ls -M /mydir1
итого 0
-rw-r--r-- 1 root root Уровень_0:Низкий:Нет:0x0 file
root@dcm14:~# # Попробуем рекурсивно поменять мандатную метку на файле и директории
root@dcm14:~# pdp-flbl -R 1:0:0:0 /mydir1
pdp-flbl: /mydir1: Отказано в доступе

Данное поведение диктуется механизмом мандатного разграничения доступа и не является ошибкой. Описание из руководства по КСЗ(Комплекс средств защиты):

Механизм контроля мандатного разграничения доступа реализован, как и механизм дискреционного разграничения доступа, в ядре ОС. При этом, принятие решения о запрете или разрешении доступа субъекта к объекту принимается на основе типа операции (чтение/запись/исполнение), мандатного контекста безопасности субъекта и мандатной меткиобъекта.
Правила принятия решения могут быть записаны следующим образом. Пусть контекст безопасности субъекта содержит уровень L0, уровень целостности iL0 и категории C0, а мандатная метка объекта содержит уровень L1, уровень целостности iL1 и категории C1. Определим операции сравнения для уровней и категорий:
1) уровень L0 меньше уровня L1 (L0<L1), если численное значение L0 меньше численного значения L1;
2) уровень L0 равен уровню L1 (L0==L1), если численные значения L0 и L1 совпадают;
3) уровень целостности iL0 меньше уровня iL1 (iL0<iL1), если численное значение iL0 меньше численного значения iL1;
4) уровень целостности iL0 равен уровню целостности iL1 (iL0==iL1), если численные значения iL0 и iL1 совпадают;
5) категории C0 меньше категорий C1 (C0<C1), если все биты набора C0 являются подмножеством набора бит C1;
6) категории С0 равны категориям C1 (C0==C1), если значения C0 и C1 совпадают;
7) операция записи разрешена, если L0==L1, iL0>=iL1 и C0==C1;
8) операция чтения разрешена, если L0>=L1, C0>=C1, ∀iL0, ∀iL1;
9) операция исполнения разрешена, если L0>=L1 и C0>=C1, ∀iL0, ∀iL1.

Поскольку запись файла в директорию является операцией записи, метки директории и файла должны совпадать. Т.е. в директории с меткой 0:0:0:0 при отсутствии специальных флагов (см. ниже) могут быть только файлы с меткой 0:0:0:0. При изменении мандатной метки на поддерево файловой системы (как в примере выше) правомерность такого изменения проверяется для каждого объекта файловой системы в отдельности. В примере выше нельзя сменить метку на директорию /mydir1 на 1:0:0:0, т.к. она содержит файл с меткой 0:0:0:0. В тоже время нельзя сменить метку файла /mydir1/file на 1:0:0:0, т.к. файл содержится в директории (т.е. объекте-контейнере) с меткой 0:0:0:0.

Обход проблемы


Как упоминалось выше, в ОССН есть специальные флаги или "типы метки" для объектов-контейнеров, с помощью которых администратор безопасности может решить проблему с рекурсивной сменой мандатной метки на файловой системе. Вот их описание из руководства по КСЗ:

В ОС предусмотрено существование объектов-контейнеров (например, каталогов), т.е. объектов, которые могут содержать другие объекты. Метка объекта-контейнера определяет максимальную метку вложенных объектов. Тип метки может использоваться для того, чтобы изменять ее эффективное действие:

– тип метки ehole применяется к объектам-контейнерам и простым объектам дляигнорирования мандатных правил разграничения доступа к ним;
– тип метки ccnr применяется к объектам-контейнерам и определяет, что объект-контейнер может содержать объекты с различными мандатными метками, но не превышающими метку объекта контейнера;
– тип метки ccnri применяется к объектам-контейнерам и определяет, что объект контейнер может содержать объекты с различными уровнями целостности, но не превышающими уровень целостности объекта-контейнера;
Ненулевой тип метки может быть установлен только привилегированным процессом. Перечисленные типы могут использоваться совместно. Таким образом, объект-контейнер может иметь тип: ccnr,ccnri,ehole.

Для того чтобы сменить метку на поддереве файловой системы в общем виде достаточно выполнить следующее:

1. Установить на все директории поддерева, начиная с верхней, мандатную метку с требуемым уровнем, набором категорий и флагом ccnr
2. Установить на все файлы поддерева мандатную метку с требуемым уровнем и набором категорий
3. Снять (если не нужна) c директорий флаг ccnr

Пример:

root@dcm14:~# pdp-ls -Md /mydir1
drwxr-xr-x 2 root root Уровень_0:Низкий:Нет:0x0 /mydir1
root@dcm14:~# pdp-ls -M /mydir1
итого 0
-rw-r--r-- 1 root root Уровень_0:Низкий:Нет:0x0 file
root@dcm14:~#
root@dcm14:~# # Сначала меняем метку на директорию. И ставим ccnr
root@dcm14:~# pdp-flbl 1:0:0:ccnr /mydir1
root@dcm14:~# pdp-ls -Md /mydir1
drwxr-xr-xm 2 root root Уровень_1:Низкий:Нет:ccnr /mydir1
root@dcm14:~# # Меняем метку файла
root@dcm14:~# pdp-flbl 1:0:0:0 /mydir1/file
root@dcm14:~# pdp-ls -M /mydir1/file
-rw-r--r--m 1 root root Уровень_1:Низкий:Нет:0x0 /mydir1/file
root@dcm14:~# # Убираем флаг ccnr
root@dcm14:~# pdp-flbl 1:0:0:0 /mydir1
root@dcm14:~# pdp-ls -M /mydir1
-rw-r--r--m 1 root root Уровень_1:Низкий:Нет:0x0 /mydir1
root@dcm14:~# # При наличие нескольких вложенных директорий ccnr придётся ставить на каждую

Пример скрипта


Пример простенького bash-сценария для рекурсивной смены мандатной метки.
ВНИМАНИЕ! Сценарий именно для примера. Можете использовать его, но без всяких гарантий.

#! /bin/bash
usage()
{
cat << EOF
Usage: $0 mac_label [path...]
EOF
}
set_label()
{

local root_lbl=$(pdp-ls -Mdn / | cut -d' ' -f5)
local max_lev=$(echo $root_lbl | cut -d':' -f1)
local max_ilev=$(echo $root_lbl | cut -d':' -f2)
find $2 -type d -exec pdp-flbl ${max_lev}:${max_ilev}:-1:ccnr,ccnri '{}' \;
find $2 -type f -exec pdp-flbl $1 '{}' \;
find $2 -type d | tac | xargs pdp-flbl $1
return 0

}
if [[ -z $1 ]]; then

usage
exit 1

fi
mac_label="$1"
shift
if [[ -z $1 ]]; then

set_label $mac_label $PWD
exit 0

fi
while [[ -n $@ ]]; do

set_label $mac_label $1
shift

done
exit 0