Загрузка...
Поддержи Openmeetings

четверг, 6 августа 2015 г.

Программное обеспечение TSF вне ядра

Программное обеспечение TSF вне ядра состоит из доверяемых приложений, которые используются, чтобы реализовать функции безопасности. Обратите внимание на то, что совместно используемые библиотеки, включая модули PAM в некоторых случаях, используются доверяемыми приложениями. Однако, не существует экземпляра, где сама совместно используемая библиотека рассматривается как доверяемый объект. Доверяемые команды могут быть сгруппированы следующим образом.
  • Системная инициализация
  • Идентификация и аутентификация
  • Сетевые приложения
  • Пакетная обработка
  • Управление системой
  • Аудит пользовательского уровня
  • Криптографическая поддержка
  • Поддержка виртуальной машины

Компоненты исполнения Linux

Компоненты исполнения ядра могут быть разделены на три составляющие части: основное ядро, потоки ядра и модули ядра, в зависимости от того, как они будут выполняться.
  • Основное ядро включает код, который выполняется, чтобы предоставить услугу, такую как обслуживание системного вызова пользователя или обслуживание события исключения, или прерывание. Большинство скомпилированного кода ядра подпадает под эту категорию.
  • Потоки ядра. Чтобы выполнить определенные стандартные задачи, такие как очистка дисковых кэшей или освобождение памяти, путем выгрузки неиспользованных страничных блоков, ядро создает внутренние процессы или потоки. Потоки запланированы точно так же, как обычные процессы, но у них нет контекста в непривилегированном режиме. Потоки ядра выполняют определенные функции языка C ядра. Потоки ядра размещены в пространстве ядра, и работают только в привилегированном режиме.
  • Модуль ядра и модуль ядра драйверов устройств  — фрагменты кода, которые могут быть загружены и выгружены в и из ядра по мере необходимости. Они расширяют функциональные возможности ядра без необходимости перезагружать систему. После загрузки объектный код модуля ядра может получить доступ к другому коду ядра и данным таким же образом, как статически скомпонованный код объекта ядра.
Драйвер устройства  — специальный тип модуля ядра, который позволяет ядру получать доступ к аппаратным средствам, соединенным с системой. Эти устройства могут быть жесткими дисками, мониторами или сетевыми интерфейсами. Драйвер взаимодействует с остающейся частью ядра через определенный интерфейс, который позволяет ядру иметь дело со всеми устройствами универсальным способом, независимо от их базовых реализаций.

Логические компоненты Linux

Ядро состоит из логических подсистем, которые обеспечивают различные функциональные возможности. Даже при том, что ядро  — единственная исполняемая программа, различные сервисы, которые оно предоставляет, могут быть разделены и объединены в разные логические компоненты. Эти компоненты взаимодействуют, чтобы обеспечить определенные функции. Ядро состоит из следующих логических подсистем:
  • Файловая подсистема и подсистема ввода-вывода: Эта подсистема реализует функции, связанные с объектами файловой системы. Реализованные функции включают те, которые позволяют процессу создавать, поддерживать, взаимодействовать и удалять объекты файловой системы. К этим объектам относятся регулярные файлы, каталоги, символьные ссылки, жесткие ссылки, файлы, специфичные для определенных типов устройств, именованные каналы и сокеты.
  • Подсистема процессов: Эта подсистема реализует функции, связанные с управлением процессами и управлением потоками. Реализованные функции позволяют создавать, планировать, исполнять и удалять процессы и субъекты потоков.
  • Подсистема памяти: Эта подсистема реализует функции, связанные с управлением ресурсами памяти системы. Реализованные функции включают в себя те, которые создают и управляют виртуальной памятью, включая управление алгоритмами разбивки на страницы и таблицами страниц.
  • Сетевая подсистема: Эта подсистема реализует сокеты UNIX и Интернет-домена, а также алгоритмы, используемые для планирования сетевых пакетов.
  • Подсистема IPC: Эта подсистема реализует функции, связанные с механизмами IPC. Реализованные функции включают в себя те, которые упрощают управляемый обмен информацией между процессами, позволяя им совместно использовать данные и синхронизировать их выполнение при взаимодействии с общим ресурсом.
  • Подсистема модулей ядра: Эта подсистема реализует инфраструктуру, позволяющую поддерживать загружаемые модули. Реализованные функции включают загрузку, инициализацию и выгрузку модулей ядра.
  • Расширения безопасности Linux: Расширения безопасности Linux реализуют различные аспекты безопасности, которые обеспечиваются для всего ядра, включая каркас Модуля безопасности Linux (Linux Security Module, LSM). Каркас LSM служит основой для модулей, позволяющей реализовать различные политики безопасности, включая SELinux. SELinux  — важная логическая подсистема. Эта подсистема реализует функции мандатного управления доступом, чтобы добиться доступа между всеми предметами и объектами.
  • Подсистема драйвера устройства: Эта подсистема реализует поддержку различных аппаратных и программных устройств через общий, не зависящий от устройств интерфейс.
  • Подсистема аудита: Эта подсистема реализует функции, связанные с записью критических по отношению к безопасности событий в системе. Реализованные функции включают в себя те, которые захватывают каждый системный вызов, чтобы записать критические по отношению к безопасности события и те, которые реализуют набор и запись контрольных данных.
  • Подсистема KVM: Эта подсистема реализует сопровождение жизненного цикла виртуальной машины. Она выполняет завершение инструкции, используемое для инструкций, требующих только небольших проверок. Для любого другого завершения инструкции KVM вызывает компонент пространства пользователя QEMU.
  • Крипто API: Эта подсистема предоставляет внутреннюю по отношению к ядру криптографическую библиотеку для всех компонентов ядра. Она обеспечивает криптографические примитивы для вызывающих сторон.

Программное обеспечение ядра функций безопасности Linux

Ядро  — это основная часть операционной системы. Оно взаимодействует непосредственно с аппаратными средствами, реализует совместное использование ресурсов, предоставляет общие сервисы для приложений, и предотвращает прямой доступ приложений к аппаратно-зависимым функциям. К числу сервисов, предоставляемых ядром, относятся:

1. У правление выполнением процессов, включая операции их создания, завершения или приостановки и межпроцессоного обмена данными. Они включают:
  • Равнозначное планирование процессов для выполнения на ЦП.
  • Разделение процессов в ЦП с использованием режима разделения по времени.
  • Выполнение процесса в ЦП.
  • Приостановка ядра по истечениии отведенного ему кванта времени.
  • Выделение времени ядра для выполнения другого процесса.
  • Перепланирование времени ядра для выполнения приостановленного процесса.
  • Управление метаданными, связанными с безопасностью процесса, такими как идентификаторы UID, GID, метки SELinux, идентификаторы функциональных возможностей.
2. Выделение оперативной памяти для исполняемого процесса. Данная операция включает в себя:
  • Разрешение, выдаваемое ядром для процессов, на совместное использование части их адресного пространства при определенных условиях; однако, при этом ядро защает собственное адресное пространство процесса от внешнего вмешательства.
  • Если система испытывает нехватку свободной памяти, ядро освобождает память путем записи процесса временно в память второго уровня или раздел подкачки.
  • Согласованное взаимодействие с аппаратными средствами машины, чтобы установить отображение виртуальных адресов на физические адреса, которое устанавливает соответствие между адресами, сгенерированными компилятором, и физическими адресами.
3. Обслуживание жизненного цикла виртуальных машин, которое включает:

  • Установление ограничений для ресурсов, сконфигурированных приложением эмуляции для данной виртуальной машины.
  • Запуск программного кода виртуальной машины на исполнение.
  • Обработка завершения работы виртуальных машин или путем завершения инструкции или задержкой завершения инструкции для эмуляции пространства пользователя.
4. Обслуживание файловой системы. Это включает в себя:
  • Выделение вторичной памяти для эффективного хранения и извлечения пользовательских данных.
  • Выделение внешней памяти для пользовательских файлов.
  • Утилизация неиспользованного пространства для хранения данных.
  • Организация структуры файловой системы (использование понятных принципов структурирования).
  • Защита пользовательских файлов от несанкционированного доступа.
  • Организация контролируемого доступа процессов к периферийным устройствам, таким как терминалы, лентопротяжные устройства, дисководы и сетевые устройства.
  • Организация взаимного доступа к данным для субъектов и объектов, предоставление управляемого доступа, основанного на политике DAC и любой другой политике, реализуемой загруженной LSM.
Ядро Linux относится к типу ядер ОС, реализующих планирование с вытеснением задач. В ядрах, не обладающих такой возможностью, выполнение кода ядра продолжается до завершения, т.е. планировщик не способен к перепланированию задачи в то время, когда она находится в ядре. Кроме того, планирование исполнения кода ядра осуществляется совместно, без вытесняющего планирования, и исполнение этого кода продолжается до момента завершения и возврата к пространству пользователя, либо до явной блокировки. В вытесняющих ядрах возможно выгрузить задачу в любой точке, пока ядро находится в состоянии, в котором безопасно выполнять перепланирование.


среда, 5 августа 2015 г.

Программы с привилегиями, связанными с программным обеспечением Linux

Примеры программ, работающих с привилегиями ,связанными с программным обеспечением:
  • Программы, исполняемые системой, например, демоны cron и init.
  • Программы, которые выполняются доверенными администраторами в рамках задач системного администрирования.
  • Программы, которые работают с привилегированными идентификаторами, выполняя программные файлы SUID.
Все программное обеспечение, которое работает с привилегиями, связанными с аппаратными средствами или привилегиями, связанными с программным обеспечением, является частью функций безопасности исследуемого ПО (TOE Security Functions, TSF).
В системе, которая администрируется надлежащим образом, непривилегированное программное обеспечение проверяется политикой безопасности системы и не имеет никаких средств обхода механизмов, обеспечивающих ее осуществление. Этому непривилегированному программному обеспечению нельзя доверять всегда; такое ПО упоминается как недостоверное программное обеспечение. Доверяемые процессы, которые не реализуют функции безопасности, должны быть защищены от несанкционированного вмешательства, с помощью функций безопасности Linux. Им необходимо доверять, чтобы не выполнить какую-либо функцию, которая нарушает политику безопасности Linux.

Функциональные возможности Linux

У ядра Linux имеется платформа для реализации привилегий, связанных с программным обеспечением, для многих различных функций, обеспеченных ядром Linux при помощи функциональных возможностей. Эти функциональные возможности, которые основываются на еще не получившем официального утверждения варианте стандарта POSIX.1e и многих других дополнительных возможностях, определенных и полностью задокументированных в файле include/linux/capability.h, позволяют разбить полномочия программного обеспечения ядра, связанного с нулевым идентификатором пользователя в ряд дискретных полномочий на основе предпринимаемых действий.
Функциональные возможности связывают с идентификаторами пользователей следующим образом:
  • Если исполняется приложение SUID от имени владельца, являющимся обладателем учетной записи root, то для данного процесса включены все функциональные возможности.
  • Если семейство системных вызовов set*uid используется для изменения UID процесса вызова на ID, не равный 0, то для такого процесса все функциональные возможности заблокированы.
  • У процессов, изначально запущенных как подпроцессы учетной записью root, имеется весь набор функциональных возможностей.
  • У процессов, изначально запущенных как подпроцессы любыми учетными записями, отличными от root, отсутствует набор функциональных возможностей.
Привилегия, связанная с программным обеспечением
Ядро ограничивает использование многих системных вызовов или функциональных областей, вызванных системными вызовами процессов, которые обладают определенными функциональными возможностями. Если вызывающий процесс не обладает необходимой возможностью, выполнение затронутой области кода будет запрещено, и вызывающей стороне будет возвращена ошибка EPERM.
Например, если процесс пытается создать специальный файл устройства, инициализируя системный вызов mknod, ядро выполняет соответствующую проверку, чтобы удостовериться, что процесс может создавать специальные файлы устройств; при этом проверяется, что процесс обладает функциональной возможностью CAP_MKNOD. В отсутствие специальных модулей ядра, которые определяют и используют соответствующие функциональные возможности (что, например, имеет место для объекта оценки), при проверке функциональных возможностей система возвращается назад, к предоставлению привилегий, связанных с программным обеспечением уровня ядра, на основе пользовательского идентификатора процесса.
Полный перечень всех функциональных возможностей, включая их описания, содержится в файле исходного кода ядра Linux include/linux/capability.h.

Политика MAC модуля обеспечения защиты Linux SELinux

Совместно с мандатным контролем доступа, реализованным с SELinux LSM, SELinux LSM MAC представляет собой политику безопасности системы, которая отличается от политики владельца в DAC, определяющей, кому к какой информации должен быть предоставлен доступ.
Политика MAC, предоставленная SELinux, опирается на два вида политики:
  • Принудительное присвоение типов (Type Enforcement, TE), которое используется, чтобы реализовать ролевую модель управления доступом
  • Многоуровневая система обеспечения безопасности (Multi-Level Security, MLS) с реализацией иерархической политики маркировки Bell-LaPadula.
Субъекты и объекты в Linux – это обычные процессы и потоки ядра. Они оба представляются структурой task_struct. Потоки ядра исполняются только в привилегированном режиме и не ограничиваются политикой MAC. Все именованные объекты, такие как обычные файлы, текстовые и блочные файлы, каталоги, сокеты и объекты IPC находятся под контролем политики MAC. Политика MAC может управлять не только именованными объектами, но также доступом к определенным структурам данных ядра, таким как дескрипторы файла, сообщения IPC и файловые системы, чтобы позволить определять политику безопасности системы на более детальном уровне.
Атрибуты безопасности субъекта и объекта, также называемые контекстом безопасности SELinux, имеют тот же самый формат. Во внешнем формате, удобном для восприятия пользователем, контекст безопасности - последовательность символов ASCII. Из соображений производительности, ядро преобразовывает эту последовательность в 32-битное целое число на этапе исполнения; однако, при описании механизма осуществления и политики безопасности контекст безопасности представлен в формате ASCII. Контекст безопасности состоит из четырех разделенных двоеточиями компонентов. Они соответствуют пользователю, роли, типу и диапазону MLS субъекта или объекта/


  • Пользователь: компонент пользователя – имя пользователя SELinux.
  • Роль: компонент роли – роль SELinux, соответствующая субъекту или объекту. Для субъектов роль используется, чтобы осуществить ролевую модель управления доступом, позволяя роли управлять доступом к доменам. Для объектов ролевой компонент не используется и является всем object_r.
  • Тип: поле типа представляет тип объекта или домен субъекта. Домены и типы - эквивалентные классы для процессов и ресурсов, соответственно. Предоставление доступа в ядре осуществляется на основании на типа объекта и домена субъекта.
  • Диапазон маркеров MLS: диапазон маркеров MLS содержит два полных маркера MLS. Они размещены так, что нижний маркер располагается слева, а верхний маркер, который является преобладающим над нижним маркером, – справа. Два маркера разделены длинным тире и формируют диапазон маркеров. Для субъектов нижний маркер диапазона соответствует действующему маркеру MLS субъекта, в то время как верхний маркер соответствует разрешениям на доступ для субъекта. Уровень доступа субъекта соответствует полномочиям пользователя, от имени которого действует субъект.
Для таких объектов, как обычные файлы, политика безопасности диктует, что нижний маркер и верхний маркер равны; таким образом объект имеет, фактически, единственный уровень. У других объектов, таких как каталоги, устройства и сокеты, может быть верхний маркер, который не равен нижнему маркеру. Эти объекты многоуровневые, и их диапазон маркеров MLS требует, чтобы уровень безопасности любой информации, которая передается через них, определял значение нижнего маркера и в то же время определялся верхним маркером.
Каждый маркер MLS состоит из двух компонентов: это иерархический уровень классификации (или уровень безопасности), и неиерархический набор категорий.
Между любыми двумя маркерами MLS могут существовать четыре возможных отношения, определяемые следующим образом (в следующем листинге L1 – нижний маркер субъекта, выполняющего запрос доступа, и L2 – нижний маркер запрашиваемого доступа к объекту):
  • L1 равен L2 (уровни равны, наборы категорий совпадают),
  • L1 переопределяет L2 (уровень L1 >= уровню L2, набор категорий L2 совпадает или является подмножеством набора категорий L1),
  • L1 переопределяется L2 (уровень L2 >= уровню L1, набор категорий L1 совпадает или является подмножеством набора категории L2),
  • L1 несравним с L2 (L1 и L2 не равны, и ни один из них не переопределяет другой).
Хранение атрибутов Атрибуты SELinux хранятся:
  • в структуре процесса task_struct для субъектов;
  • в структуре данных, размещенной на диске и в ядре, для объектов файловой системы;
  • в структуре данных kern_ipc_perm для объектов IPC системы System V;
  • в структуре данных sock для сокетов;
  • в структуре xfrm_state для сокетов netlink;
  • в структуре данных key для ключей.
SELinux приводит недействительные или неправильные контексты к контексту system_u:object_r:unlabeled_t:s0.
Правила контроля доступа Реализация управления доступом MAC основана на принудительном присвоении типов (Type Enforcement, TE). TE обеспечивает определяемое на более детальном уровне управление доступом к субъектам и объектам.
TE и правила политики MLS определяются с политикой SELinux. Правила TE определяются как проверки управления доступом, тогда как политика MLS определяется как ограничение, накладываемое поверх TE. Поэтому полная проверка управления доступом выполняется за три логических шага, следующим образом:
  1. Первой выполняется проверка DAC, использующая атрибуты DAC, за которой следует
  2. проверка TE, использующая домены и типы контекста безопасности SELinux, за которой следует
  3. проверка политики MLS Bell-LaPadula, использующая диапазон маркеров MLS контекста безопасности SELinux.
Каждая из выполняемых проверок неавторитетная. Таким образом, права доступа только сильнее ограничиваются на каждой следующей стадии; отказ в праве доступа, установленный политикой DAC, не может быть переопределен TE, а отказ в праве доступа, установленный TE, не может быть переопределен MLS.
Привилегии, связанные с программным обеспечением для политики MAC реализуются с использованием домена защиты процесса и правил политики безопасности, связанных с этим доменом. Например, процессам, исполняющимся в домене init_t, предоставлен доступ на чтение к объектам, маркер контекста безопасности которых преобладает над маркером контекста безопасности процесса. Это переопределение определяется атрибутами домена. Правило политики устанавливает доступ домена к типу с переопределением, привязанным к атрибуту домена. Например, следующее правило политики может использоваться, чтобы разрешить процессу переопределять ограничение Bell-LaPadula, запрещающее доступ на чтение, когда этот процесс выполняет попытку прочитать обычный файл:

Листинг 3.1: ограничение политики MLS SELinux
mlsconstrain { file } { read } (( l1 dom l2) or (t1 == mlsfileread ))
Приведенный выше оператор устанавливает политику безопасности, при которой маркер l1 (принадлежащий субъекту), должен преобладать над над маркером l2 (принадлежащим объекту) для операции чтения данных, чтобы разрешить доступ на чтение, если у домена процесса нет атрибута mlsfileread.
Политика безопасности системы для различных типов субъектов и объектов приводится в функциональных описаниях данных субъектов и объектов.
В дополнение к атрибутам процесса, которые могут переопределять права доступа, ядро Linux обладает следующей возможностью: CAP_MAC_OVERRIDE. Если процесс обладает этой возможностью, он может обойти принудительное выполнение всех политик SELinux.