Безопасность партиций

Вопросы безопасности при использовании квотирования

Статья включает:

Управление безопасностью планировщика потоков
Безопасность критически важных потоков

Управление безопасностью планировщика потоков

По умолчанию любой пользователь системы может создавать партиции и изменять их атрибуты. Мы рекомендуем задавать подходящий для системы уровень безопасности командой SCHED_APS_ADD_SECURITY функции SchedCtl() или командой aps modify.

В следующем списке перечислены (в порядке усиления) основные параметры безопасности команды aps и соответствующие флаги функции SchedCtl():

none (или флаг SCHED_APS_SEC_OFF)
Любой пользователь системы может создавать партиции и изменять их атрибуты.
basic (или флаг SCHED_APS_SEC_BASIC)
Только процессы с привилегиями суперпользователя, которые выполняются в партиции System, могут изменять глобальные параметры планирования и задавать резервные бюджеты.
flexible (или флаг SCHED_APS_SEC_FLEXIBLE)
Только процессы с привилегиями суперпользователя, которые выполняются в партиции System, могут изменять параметры планирования и резервные бюджеты. Тем не менее, процессы с привилегиями суперпользователя могут создавать субпартиции, помещать в них свои потоки, а также изменять субпартиции независимо от партиции, в которой они выполняются. Это позволяет приложениям создавать локальные субпартиции вне своих бюджетов. Бюджеты не должны быть нулевыми.
recommended (или флаг SCHED_APS_SEC_RECOMMENDED)
Только процессы с привилегиями суперпользователя, которые выполняются в партиции System, могут создавать партиции и изменять параметры. Этот механизм создает двухуровневую иерархию, которая состоит из партиции System и ее потомков. Только процессы с привилегиями суперпользователя, которые выполняются в партиции System, могут присоединять свои потоки к партициям. Бюджеты не должны быть нулевыми.


Note: Рекомендуется устанавливать уровень безопасности не ниже basic; исключение составляет лишь тестирование партиционирования, при котором удобно менять любые параметры, не перезапуская систему.

После настройки партиций планировщика можно устанавливать флаг SCHED_APS_SEC_LOCK_PARTITIONS, чтобы в дальнейшем запрещать несанкционированные изменения. Пример:

sched_aps_security_parms p;
APS_INIT_DATA( &p );
p.sec_flags = SCHED_APS_SEC_LOCK_PARTITIONS;
SchedCtl( SCHED_APS_ADD_SECURITY, &p, sizeof( p ) );


Note: Перед вызовом функции SchedCtl() необходимо инициализировать все элементы структуры данных, связанной с соответствующей командой. Для этого можно использовать макрос APS_INIT_DATA().

Вышеуказанные параметры безопасности представляют собой удобные в использовании комбинации отдельных параметров:

root0_overall (или флаг SCHED_APS_SEC_ROOT0_OVERALL)
Чтобы процесс мог изменять глобальные параметры планирования (например, размер окна усреднения), он должен выполняться с привилегиями суперпользователя в партиции System.
root_makes_partitions (или флаг SCHED_APS_SEC_ROOT_MAKES_PARTITIONS)
Чтобы процесс мог создавать и изменять партиции, он должен выполняться с привилегиями суперпользователя.
sys_makes_partitions (или флаг SCHED_APS_SEC_SYS_MAKES_PARTITIONS)
Чтобы процесс мог создавать и изменять партиции, он должен выполняться в партиции System.
parent_modifies (или флаг SCHED_APS_SEC_PARENT_MODIFIES)
Разрешает изменение партиций (SCHED_APS_MODIFY_PARTITION), однако процесс должен выполняться в партиции, которая является родительской по отношению к изменяемой. Под изменением понимается назначение партиции нового бюджета или резервного бюджета, а также присоединение событий с помощью команды SCHED_APS_ATTACH_EVENTS.
nonzero_budgets (или флаг SCHED_APS_SEC_NONZERO_BUDGETS)
Нельзя назначать партиции нулевой бюджет при ее создании или изменении. Этот параметр следует устанавливать для всех партиций, кроме тех, которые только реагируют на запросы клиентов (например, принимают сообщения).
root_makes_critical (или флаг SCHED_APS_SEC_ROOT_MAKES_CRITICAL)
Чтобы процесс мог назначать ненулевой резервный бюджет и изменять текущий резервный бюджет, он должен выполняться с привилегиями суперпользователя.
sys_makes_critical (или флаг SCHED_APS_SEC_SYS_MAKES_CRITICAL)
Чтобы процесс мог назначать ненулевой резервный бюджет и изменять текущий резервный бюджет, он должен выполняться в партиции System.
root_joins (или флаг SCHED_APS_SEC_ROOT_JOINS)
Чтобы процесс мог присоединять поток к партиции, он должен выполняться с привилегиями суперпользователя.
sys_joins (или флаг SCHED_APS_SEC_SYS_JOINS)
Чтобы процесс мог присоединять поток к партиции, он должен выполняться в партиции System.
parent_joins (или флаг SCHED_APS_SEC_PARENT_JOINS)
Процесс должен выполняться в родительской партиции по отношению к партиции, к которой присоединяется поток.
join_self_only (или флаг SCHED_APS_SEC_JOIN_SELF_ONLY)
Процесс может помещать в партицию только себя самого.
partitions_locked (или флаг SCHED_APS_SEC_PARTITIONS_LOCKED)
Запрещает изменять бюджеты любых партиций и глобальные параметры планирования (например, размер окна усреднения). Следует устанавливать этот флаг по окончании настройки партиций.

Безопасность критически важных потоков

Любой поток может объявить себя критически важным, а разработчик — создать критически важное событие ( sigevent), которое переводит адресата в критический режим выполнения. Тем не менее, это не угрожает безопасности системы, поскольку критически важный поток, который находится в партиции без резервного бюджета, не влияет на планировщика потоков. У планировщика потоков имеются параметры безопасности, которые определяют, кто может задавать или изменять резервный бюджет партиции.

Для защиты системы от неполадок в критических важных потоках следует:




Предыдущий раздел: перейти