Вопросы безопасности при использовании квотирования
Статья включает:
По умолчанию любой пользователь системы может создавать партиции и изменять их атрибуты. Мы рекомендуем задавать подходящий для системы уровень безопасности командой 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, могут присоединять свои потоки к партициям. Бюджеты не должны быть нулевыми.
 | Рекомендуется устанавливать уровень безопасности не ниже 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 ) );
 | Перед вызовом функции 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), которое переводит адресата в критический режим выполнения. Тем не менее, это не угрожает безопасности системы, поскольку критически важный поток, который находится в партиции без резервного бюджета, не влияет на планировщика потоков. У планировщика потоков имеются параметры безопасности, которые определяют, кто может задавать или изменять резервный бюджет партиции.
Для защиты системы от неполадок в критических важных потоках следует:
- назначать резервный бюджет только партициям, которым он необходим;
- по возможности размещать прикладные программы вне партиции System, которая имеет бесконечный резервный бюджет.
Предыдущий раздел: перейти