Доверенные вычисления

Основы концепции доверенных вычислений

Описание доверенных вычислений

Разные международные организации трактуют термин «доверие» или «доверенный» по-разному.

  • Организация Trusted Computing Group (TCG):

    Сущность, которой доверяют, всегда достигает желаемой цели ожидаемым образом.

  • Международная организация по стандартизации (ISO) и Международная электротехническая комиссия (МЭК) (1999 г.):

    Задействованные в вычислениях компоненты, операции или процессы предсказуемы при любых условиях и устойчивы к вирусам и определенной степени физических помех.

  • Технический комитет компьютерного общества IEEE по гарантоспособным вычислениям:

    Доверие означает, что надежность сервисов, предоставляемых компьютерной системой, можно доказать, а само это понятие связано в основном с надежностью и доступностью системы.

Проще говоря, доверие означает, что система работает в соответствии с заранее определенной схемой и политикой.

Доверенная вычислительная система состоит из корня доверия, доверенной аппаратной платформы, операционной системы (ОС) и приложения. Основная идея такой системы состоит в том, чтобы сначала создать доверенную вычислительную базу (trusted computing base, TCB), а затем установить цепь доверия, охватывающую аппаратную платформу, ОС и приложение. В цепи доверия проверка подлинности выполняется от корня до следующего уровня, распространяя доверие от уровня к уровню и формируя безопасную и доверенную вычислительную среду.

image$trusted chain

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

Архитектура проверки целостности (IMA) в ядре

Обзор

IMA

Архитектура проверки целостности (integrity measurement architecture, IMA) является подсистемой ядра. IMA может проверять файлы, доступ к которым осуществляется через системы execve(), mmap() и open() на основе определяемых пользователем политик. Результат проверки можно использовать для локальной или удалённой аттестации или сравнивать с существующим эталонным значением для контроля доступа к файлам.

Согласно определению с вики-сайта, функция подсистемы проверки целостности ядра включает в себя три задачи.

  • Измерение: обнаружение случайных или злонамеренных изменений файлов удалённо или локально.

  • Оценка: измерение файла и его сравнение с эталонным значением, хранящимся в расширенном атрибуте, для контроля целостности локального файла.

  • Аудит: запись результата измерения в системные журналы для аудита.

Образно говоря, измерение IMA можно сравнить с наблюдателем, который лишь фиксирует изменение, не вмешиваясь в него, а оценку IMA — скорее со строгим охранником, пресекающим любой несанкционированный доступ к программам.

EVM

Расширенный модуль расширенной (extended verification module, EVM) используется для вычисления хеш-значения на основе расширенных атрибутов безопасности файла в системе, включая security.ima и security.selinux. Затем это значение подписывается с помощью ключа, хранящегося в доверенном платформенном модуле (TPM) или других доверенных средах. Значение подписи хранится в security.evm и не может быть незаконно изменено. Если это значение незаконно изменено, проверка подписи при повторном обращении к файлу завершается ошибкой.

Таким образом, EVM используется для обеспечения автономной защиты расширенных атрибутов безопасности путем вычисления хеша атрибутов, их подписания и сохранения в security.evm.

Дайджест-списки IMA

Дайджест-списки IMA представляют собой усовершенствование оригинального механизма защиты целостности ядра, предоставляемого openEuler. Они заменяют собой исходный механизм IMA для защиты целостности файлов.

Дайджест-списки представляют собой двоичные файлы данных в особом формате. Каждый дайджест-список соответствует пакету RPM, и в нем фиксируются хеш-значения защищенных файлов (исполняемых файлов и файлов динамических библиотек) в этом пакете RPM.

После надлежащей настройки параметров запуска ядро формирует хеш-таблицу (невидимую из пользовательского пространства) и предоставляет интерфейсы (digest_list_data и digest_list_data_del), которые обновляют эту хеш-таблицу с помощью securityfs. Дайджест-списки при их создании подписываются с помощью закрытого ключа. При выгрузке в ядро через интерфейс дайджест-списки требуется проверять с помощью открытого ключа в ядре.

image$ima digest list update

Когда оценка IMA включена, при каждом обращении к исполняемому файлу или файлу динамической библиотеки, в ядре запускается перехватчик (hook) для вычисления хеш-значений содержимого файла и расширенных атрибутов, а также поиска по хеш-таблице ядра. Если вычисленные хеш-значения совпадают с указанными в таблице, выдается разрешение на выполнение файла. В противном случае доступ будет запрещен.

image$ima verification

Расширение IMA Digest Lists, предоставляемое ядром openEuler, обеспечивает более высокие показатели безопасности, производительности и удобства использования по сравнению с собственным механизмом IMA ядра, облегчая реализацию механизма защиты целостности в рабочей среде.

  • Полная цепь доверия для высокого уровня безопасности

    Собственный механизм IMA требует, чтобы расширенный атрибут файла был заранее создан и помечен в действующей сети. При обращении к файлу его расширенный атрибут используется в качестве эталонного значения, что дает неполную цепь доверия.

    Расширение IMA Digest Lists сохраняет эталонное хеш-значение файла в пространстве ядра. Во время построения это эталонное хеш-значение файла передается в выпускаемый пакет RPM в виде дайджест-списка. При установке пакета RPM дайджест-список импортируется, и выполняется проверка подписи, чтобы гарантировать, что эталонное значение поступает от издателя программного обеспечения, и реализовать полную цепь доверия.

  • Превосходная производительность

    Микросхема доверенного платформенного модуля (TPM) является низкоскоростной, что делает операцию расширения PCR узким местом производительности в сценарии измерения IMA. Чтобы устранить это узкое место, расширение Digest Lists сокращает число ненужных операций расширения PCR, обеспечивая при этом безопасность и повышая производительность на 65 % по сравнению с собственным механизмом IMA.

    В сценарии оценки IMA расширение Digest Lists выполняет проверку подписи на этапе запуска, чтобы предотвратить выполнение такой проверки при каждом обращении к файлу. Это помогает повысить производительность доступа к файлам на этапе работы на 20 % по сравнению с собственным сценарием оценки IMA.

  • Быстрое развёртывание и удобное обновление

    При первом развёртывании собственного механизма IMA или обновлении программного пакета нужно переключиться в режим исправлений, вручную пометить расширенные атрибуты файла, а затем перезапустить систему, чтобы перейти в принудительный режим. Таким образом, к установленной программе можно обращаться обычным образом.

    Расширение Digest Lists можно использовать сразу после завершения установки. Кроме того, пакет RPM можно установить или обновить напрямую в принудительном режиме без перезапуска системы или ручной пометки расширенных атрибутов файла. Это сводит к минимуму количество усилий со стороны пользователя во время такой операции, обеспечивая быстрое развёртывание и удобное обновление в действующей сети.

    Расширение IMA Digest Lists переносит проверку подписи собственного механизма IMA на этап запуска. Это позволяет надеяться, что память в пространстве ядра не может быть незаконно изменена. Фактически защита целостности памяти ядра посредством IMA зависит и от других механизмов обеспечения безопасности (безопасный запуск модуля ядра и измерение динамической памяти).

    И собственный механизм IMA, и расширение IMA Digest Lists являются лишь звеном в цепи доверия доверенных вычислений и не могут обеспечить безопасность системы в одиночку. Выстраивание системы безопасности всегда требует систематического подхода, основанного на эшелонированной защите.

Ограничения

  1. Текущий режим оценки IMA может защищать только неизменяемые файлы в системе, включая исполняемые файлы и файлы динамических библиотек.

  2. IMA обеспечивает измерение целостности на прикладном уровне. Безопасность IMA зависит от надежности предыдущих звеньев.

  3. В настоящее время IMA не поддерживает импорт дайджест-списков сторонних приложений.

  4. Журнал запуска может содержать сообщение Unable to open file: /etc/keys/x509_ima.der (Не удалось открыть файл: /etc/keys/x509_ima.der). Об этой ошибке сообщает сообщество открытого кода, и она не влияет на использование функции дайджест-списков IMA.

  5. В версии ARM могут возникать ошибки аудита при включении режима журнала для IMA. Это происходит из-за того, что modprobe загружает модуль ядра до того, как будут импортированы дайджест-списки, однако это не затрагивает обычные функции.

Сценарий применения

Измерение IMA

Целью измерения IMA является обнаружение непредусмотренных или вредоносных изменений в системных файлах. Результат измерения можно использовать для локальной или удалённой аттестации.

Если в системе присутствует микросхема TPM, результат измерения заносится в указанный регистр PCR микросхемы TPM. Благодаря однонаправленному расширению PCR и аппаратной защите чипа TPM пользователь не может изменить расширенный результат измерения, что гарантирует подлинность результата измерения.

Пользователь может настроить область действия файла и условия активации измерения IMA с помощью политики IMA.

По умолчанию архитектура IMA отключена. Однако система ищет файл политики ima-policy по пути /etc/ima/. Если файл найден, система измеряет файлы в системе на основе политики во время запуска. Если вы не хотите вручную компилировать файл политики, можно настроить ima_policy=tcb в параметрах запуска, используя политику по умолчанию. Подробные сведения о дополнительных параметрах политики см. в разделе Параметры запуска IMA в приложении.

Текущую загруженную политику IMA можно проверить в файле /sys/kernel/security/ima/policy. Журнал измерений IMA находится в файле /sys/kernel/security/ima/ascii_runtime_measurements, как показано на следующем рисунке.

Пример команды:

head /sys/kernel/security/ima/ascii_runtime_measurements

Пример вывода:

10 ddee6004dc3bd4ee300406cd93181c5a2187b59b ima-ng sha1:9797edf8d0eed36b1cf92547816051c8af4e45ee boot_aggregate
10 180ecafba6fadbece09b057bcd0d55d39f1a8a52 ima-ng sha1:db82919bf7d1849ae9aba01e28e9be012823cf3a /init
10 ac792e08a7cf8de7656003125c7276968d84ea65 ima-ng sha1:f778e2082b08d21bbc59898f4775a75e8f2af4db /bin/bash
10 0a0d9258c151356204aea2498bbca4be34d6bb05 ima-ng sha1:b0ab2e7ebd22c4d17d975de0d881f52dc14359a7 /lib64/ld-2.27.so
10 0d6b1d90350778d58f1302d00e59493e11bc0011 ima-ng sha1:ce8204c948b9fe3ae67b94625ad620420c1dc838 /etc/ld.so.cache
10 d69ac2c1d60d28b2da07c7f0cbd49e31e9cca277 ima-ng sha1:8526466068709356630490ff5196c95a186092b8 /lib64/libreadline.so.7.0
10 ef3212c12d1fbb94de9534b0bbd9f0c8ea50a77b ima-ng sha1:f80ba92b8a6e390a80a7a3deef8eae921fc8ca4e /lib64/libc-2.27.so
10 f805861177a99c61eabebe21003b3c831ccf288b ima-ng sha1:261a3cd5863de3f2421662ba5b455df09d941168 /lib64/libncurses.so.6.1
10 52f680881893b28e6f0ce2b132d723a885333500 ima-ng sha1:b953a3fa385e64dfe9927de94c33318d3de56260 /lib64/libnss_files-2.27.so
10 4da8ce3c51a7814d4e38be55a2a990a5ceec8b27 ima-ng sha1:99a9c095c7928ecca8c3a4bc44b06246fc5f49de /etc/passwd

Содержание каждой записи слева направо:

  1. PCR: регистр ПЦР для расширения результатов измерений (значение по умолчанию — 10, этот регистр функционирует, только если в системе установлена микросхема TPM).

  2. Хеш-значение шаблона: хеш-значение, которое в конечном итоге используется для расширения, объединяя хеш содержимого файла, длину и значение пути к файлу.

  3. Шаблон: шаблон расширенного значения измерения, например ima-ng.

  4. Хеш-значение содержимого файла: хеш-значение измеренного содержимого файла.

  5. Путь к файлу: путь к измеренному файлу.

Оценка IMA

Целью оценки IMA является контроль доступа к локальным файлам путем сравнения эталонного значения со стандартным эталонным значением.

IMA использует атрибуты расширения security.ima и security.evm для хранения эталонных значений измерения целостности файлов.

  • security.ima: хранит хеш-значение содержимого файла;

  • security.evm: хранит подпись хеш-значения расширенного атрибута файла.

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

  1. Используйте открытый ключ в наборе ключей ядра, чтобы проверить значение подписи в расширенном атрибуте файла security.evm, и сравните это значение подписи с хеш-значением расширенного атрибута текущего файла. Если они совпадают, расширенный атрибут файла является полным (включая security.ima).

  2. Когда расширенный атрибут файла является полным, система сравнивает расширенный атрибут файла security.ima с хеш-значением текущего содержимого файла. Если они совпадают, система разрешает доступ к файлу.

Аналогичным образом пользователи могут настроить область действия файла и условия активации для оценки IMA с помощью политик IMA.

Дайджест-списки IMA

В настоящее время расширение IMA Digest Lists поддерживает три следующих комбинации параметров запуска.

  • Режим измерения IMA:

    ima_policy=exec_tcb ima_digest_list_pcr=11
  • Режим журнала оценки IMA + режим измерения IMA:

    ima_template=ima-sig ima_policy="exec_tcb|appraise_exec_tcb|appraise_exec_immutable" initramtmpfs ima_hash=sha256 ima_appraise=log evm=allow_metadata_writes evm=x509 ima_digest_list_pcr=11 ima_appraise_digest_list=digest
  • Режим принудительной оценки IMA + режим измерения IMA:

    ima_template=ima-sig ima_policy="exec_tcb|appraise_exec_tcb|appraise_exec_immutable" initramtmpfs ima_hash=sha256 ima_appraise=enforce-evm evm=allow_metadata_writes evm=x509 ima_digest_list_pcr=11 ima_appraise_digest_list=digest

Процедура

Первоначальное развёртывание в сценарии с собственным механизмом IMA

При первом запуске системы нужно настроить следующие параметры запуска:

ima_appraise=fix ima_policy=appraise_tcb

В режиме исправлений fix система может быть запущена, когда эталонное значение недоступно. appraise_tcb соответствует политике IMA. Дополнительные сведения см. в разделе Параметры запуска IMA в приложении.

Затем вам нужно получить доступ ко всем файлам, которые требуется проверить, чтобы добавить к ним расширенные атрибуты IMA:

time find / -fstype ext4 -type f -uid 0 -exec dd if='{}' of=/dev/null count=0 status=none \;

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

getfattr -m - -d /sbin/init

Пример вывода:

# file: sbin/init
security.ima=0sAXr7Qmun5mkGDS286oZxCpdGEuKT
security.selinux="system_u:object_r:init_exec_t"

Настройте следующие параметры запуска и перезапустите систему:

ima_appraise=enforce ima_policy=appraise_tcb

Первоначальное развёртывание в сценарии с механизмом дайджест-списков Digest Lists

  1. Настройте параметры ядра для перехода в режим журнала.

    1. Добавьте следующие параметры, чтобы отредактировать файл /boot/efi/EFI/euleros/grub.cfg:

      ima_template=ima-sig ima_policy="exec_tcb|appraise_exec_tcb|appraise_exec_immutable" initramtmpfs ima_hash=sha256 ima_appraise=log evm=allow_metadata_writes evm=x509 ima_digest_list_pcr=11 ima_appraise_digest_list=digest
    2. Выполните команду reboot, чтобы перезагрузить систему и войти в режим журнала. В этом режиме включена проверка целостности, однако систему можно запустить, даже если эта проверка не пройдена.

  2. Установите пакеты зависимостей.

    1. Выполните команду yum, чтобы установить digest-list-tools и ima-evm-utils:

      yum install digest-list-tools ima-evm-utils
    2. Убедитесь, что установленные пакеты имеют версии не ниже указанных:

      Команда проверки:

      rpm -qa | grep <пакет>

      Ожидаемые результаты вывода:

      digest-list-tools-0.3.93-1.oe1.x86_64
      ima-evm-utils-1.2.1-9.oe1.x86_64
  3. Если пакет установлен plymouth, нужно добавить -a в конец команды cp в строке 147 файла скрипта /usr/libexec/plymouth/plymouth-populate-initrd:

           ...
           ddebug "Installing $_src"
        cp -a --sparse=always -pfL "$PLYMOUTH_SYSROOT$_src" "${initdir}/$target"
  4. Выполните dracut, чтобы снова создать initrd:

    dracut -f -e xattr
  5. Отредактируйте файл /boot/efi/EFI/euleros/grub.cfg, изменив ima_appraise=log на ima_appraise=enforce-evm.

    ima_template=ima-sig ima_policy="exec_tcb|appraise_exec_tcb|appraise_exec_immutable" initramtmpfs ima_hash=sha256 ima_appraise=enforce-evm evm=allow_metadata_writes evm=x509 ima_digest_list_pcr=11 ima_appraise_digest_list=digest
  6. Выполните команду reboot, чтобы завершить первоначальное развёртывание.

Создание дайджест-списков в OBS

Open Build Service (OBS) — это система компиляции, которая впервые использовалась для сборки программных пакетов в openSUSE и поддерживает распределенную компиляцию для нескольких архитектур.

Перед созданием дайджест-списка убедитесь, что ваш проект содержит следующие пакеты RPM из openEuler:

  • digest-list-tools;

  • openEuler-rpm-config;

  • pesign-obs-integration;

  • rpm;

  • selinux-policy.

Добавьте конфигурацию проекта в итоговый проект:

Preinstall: pesign-obs-integration digest-list-tools selinux-policy-targeted
Macros:
%__brp_digest_list /usr/lib/rpm/openEuler/brp-digest-list %{buildroot}
:Macros
  • В Preinstall добавлено следующее содержимое: digest-list-tools для создания дайджест-списка; pesign-obs-integration для создания подписи дайджест-списка; selinux-policy-targeted для обеспечения правильной метки SELinux в среде при создании дайджест-списка.

  • Определите макрос %__brp_digest_list в Macros. RPM запускает этот макрос, чтобы создать дайджест-список для скомпилированного двоичного файла на этапе сборки. Этот макрос можно использовать в качестве переключателя для управления тем, создается ли дайджест-списка в проекте.

После завершения настройки OBS автоматически выполняет полную сборку. Обычно в программный пакет добавляются следующие два файла.

  • /etc/ima/digest_lists/0-metadata_list-compact-<пакет>-<версия>;

  • /etc/ima/digest_lists.tlv/0-metadata_list-compact_tlv-<пакет>-<версия>.

Создание дайджест-списков на Koji

Koji — это система компиляции сообщества Fedora. В будущем сообщество openEuler реализует поддержку Koji.

Часто задаваемые вопросы

Почему не запускается система, не выполняются команды либо сервисы работают неправильно после запуска системы в принудительном режиме?

В принудительном режиме IMA контролирует доступ к файлам. Если содержимое или расширенные атрибуты файла, к которому осуществляется доступ, неполны, доступ будет запрещен. Если ключевые команды, отвечающие за запуск системы, не могут быть выполнены, ее запуск невозможен.

Проверьте наличие следующих проблем.

  • Проверьте, добавлен ли дайджест-список в initrd.

    Проверьте, выполняется ли команда dracut для добавления дайджест-списка в ядро во время первоначального развёртывания. Если дайджест-список не добавлен в initrd, он не может быть импортирован во время запуска. В результате запуск завершается сбоем.

  • Проверьте, используется ли официальный пакет RPM.

    Если используется неофициальный RPM-пакет openEuler, он может не содержать дайджест-список, либо закрытый ключ для подписи дайджест-списка может не совпадать с открытым ключом для проверки подписи в ядре. В результате дайджест-список не импортируется в ядро.

    Если причина не ясна, войдите в режим журнала и найдите причину в журнале ошибок:

    dmesg | grep appraise

Почему осуществляется контроль доступа к системным файлам в принудительном режиме?

Если система не осуществляет контроль доступа к файлу должным образом, проверьте, правильно ли настроена политика IMA в параметрах запуска:

cat /proc/cmdline

Пример вывода:

...ima_policy=exec_tcb|appraise_exec_tcb|appraise_exec_immutable...

Выполните следующую команду, чтобы проверить, вступила ли в силу политика IMA в текущем ядре:

cat /sys/kernel/security/ima/policy

Если файл политики пуст, значит политика не задана. В этом случае система не осуществляет контроль доступа.

Нужно ли после завершения первоначального развёртывания вручную выполнять команду dracut для создания initrd после установки, обновления или удаления программного пакета?

Нет. Подключаемый модуль digest_list.so, входящий в состав пакета RPM, может автоматически обновлять дайджест-список с детализацией на уровне пакета RPM, позволяя пользователям не заботиться о дайджест-списке.

Приложения

Описание интерфейса securityfs IMA

Собственный механизм IMA предоставляет следующие интерфейсы securityfs.

Следующие пути к интерфейсу находятся в каталоге /sys/kernel/security/.
Путь Разрешение Описание

ima/policy

600

Интерфейс политики IMA

ima/ascii_runtime_measurement

440

Результат измерения IMA в формате кода ASCII

ima/binary_runtime_measurement

440

Результат измерения IMA в двоичном формате

ima/runtime_measurement_count

440

Статистика результатов измерений

ima/violations

440

Число конфликтов среди результатов измерений IMA

evm

660

Режим EVM, то есть режим проверки целостности расширенных атрибутов файлов

Значения /sys/kernel/security/evm приведены ниже.

  • 0 — EVM не инициализирован.

  • 1 — использует HMAC (симметричное шифрование) для проверки целостности расширенных атрибутов.

  • 2 — использует подпись открытого ключа (асимметричное шифрование) для проверки целостности расширенных атрибутов.

  • 6 — отключает проверку целостности расширенных атрибутов (этот режим используется для openEuler).

Ниже приведены дополнительные интерфейсы securityfs, предоставляемые расширением IMA Digest Lists.

Путь Разрешение Описание

ima/digests_count

440

Общее количество хешей (IMA+EVM) в хеш-таблице системы

ima/digest_list_data

200

Новые интерфейсы в дайджест-списке

ima/digest_list_data_del

200

Интерфейсы, удалённые из дайджест-списка

Синтаксис политики IMA

Каждый оператор политики IMA должен начинаться с действия, представленного ключевым словом action, за которым следует условие фильтрации.

  • action: указывает действие политики. Для политики можно выбрать только одно действие.

    Вы можете опустить слово action и прямо написать dont_measure вместо action=dont_measure.
  • func: указывает тип файла для измерения или проверки подлинности. Часто используется вместе с mask. Для политики можно выбрать только один параметр func.

    • FILE_CHECK можно использовать только с MAY_EXEC, MAY_WRITE и MAY_READ.

    • MODULE_CHECK, MMAP_CHECK и BPRM_CHECK можно использовать только с MAY_EXEC.

    • Комбинация, не учитывающая указанные выше сочетания, не вступает в силу.

  • mask — указывает операцию, при которой файлы будут измеряться или оцениваться. Для политики можно выбрать только один параметр mask.

  • fsmagic — указывает шестнадцатеричное магическое число типа файловой системы, которое определено в файле /usr/include/linux/magic.h.

    По умолчанию производится измерение всех файловых систем, если только не применяется dont_measure/dont_appraise, чтобы пометить файловую систему как не подлежащую измерению.
  • fsuid: указывает UUID системного устройства. Значение представляет собой шестнадцатеричную строку из 16 символов.

  • objtype: указывает тип файла. Для политики можно выбрать только один тип файла.

    objtype имеет более высокую степень детализации, чем func. Например, obj_type=nova_log_t указывает на файл журнала nova.

  • uid: указывает пользователя (представленного идентификатором пользователя), который выполняет операции с файлом. Для политики можно выбрать только один параметр uid.

  • fowner: указывает владельца (представленного идентификатором пользователя) для файла. Для политики можно выбрать только один параметр fowner.

Значения и описание ключевых слов приведены ниже:

  • action

    • measure — включение измерения IMA.

    • dont_measure — отключение измерения IMA.

    • appraise — включение оценки IMA.

    • dont_appraise — отключение оценки IMA.

    • audit — включение аудита.

  • func

    • FILE_CHECK — открываемый файл.

    • MODULE_CHECK — загружаемый файл модуля ядра.

    • MMAP_CHECK — файл динамической библиотеки, который нужно сопоставить с пространством памяти процесса.

    • BRPM_CHECK — исполняемый файл, за исключением файлов скриптов, открытых программами, таких как /bin/hash.

    • POLICY_CHECK — файл, загружаемый в дополнение к политике IMA.

  • FIRMWARE_CHECK — встроенное ПО, загружаемое в память.

  • DIGEST_LIST_CHECK — файл дайджест-списка, загружаемый в ядро.

    • KEXEC_KERNEL_CHECK — ядро kexec, на которое нужно переключиться.

  • mask

    • MAY_EXEC — выполнение файла.

    • MAY_WRITE — запись данных в файл. Использовать эту операцию не рекомендуется, так как она ограничена такими механизмами открытого кода, как echo и vim (суть изменения заключается в создании временного файла и последующем его переименовании). Измерение IMA MAY_WRITE не запускается при каждом изменении файла.

    • MAY_READ — считывание файла.

    • MAY_APPEND — расширение атрибутов файла.

  • fsmagic — шестнадцатеричное магическое число типа файловой системы.

  • fsuuid — UUID системного устройства. Значение представляет собой шестнадцатеричную строку из 16 символов.

  • fowner — идентификатор владельца файла.

  • uid — идентификатор пользователя, который работает с файлом.

  • obj_type — тип файла (на основе тега SELinux).

  • pcr — выбор PCR, используемого для расширения значений измерений в TPM. Значение по умолчанию — 10.

  • appraise_type

    • imasig — оценка IMA на основе подписей.

    • meta_immutable — оценка расширенных атрибутов файла на основе подписей (с поддержкой дайджест-списка).

Значение PATH_CHECK эквивалентно FILE_CHECK, а значение FILE_MMAP эквивалентно MMAP_CHECK. В этом списке они не указаны.

Параметры запуска собственного механизма IMA

Параметры запуска ядра собственного механизма IMA:

  • ima_appraise

    • off — отключение режима оценки IMA. В этом случае при обращении к файлу проверка целостности не выполняется, и для файла не генерируется никаких новых эталонных значений.

    • enforce — включение режима принудительной оценки IMA для выполнения проверки целостности во время обращения к файлу. То есть вычисляется хеш-значение файла и затем сравнивается с эталонным значением. Если сравнение показывает различия, доступ к файлу отклоняется. В этом случае IMA создает новое эталонное значение для нового файла.

    • fix — включение режима восстановления IMA. В этом режиме можно обновить эталонное значение защищенного файла.

    • log — включение режима журнала для оценки IMA при выполнении проверки целостности во время обращения к файлу. Однако команды могут выполняться даже в случае сбоя проверки, и записываются только журналы.

  • ima_policy

    • tcb — измерение всех исполняемых файлов, сопоставленных динамических библиотек, импортированных модулей ядра и загруженных драйверов устройства. Измеряется также характер чтения файлов пользователя root.

    • appraise_tcb — оценка всех файлов, владельцем которых является пользователь root.

    • secure_boot — оценка импорта модулей ядра, загрузки драйверов устройства, переключения на ядро kexec и политик IMA. Обязательным условием является наличие у данных файлов подписей IMA.

  • ima_tcb — эквивалентно ima_policy=tcb.

  • ima_appraise_tcb — эквивалентно ima_policy=appraise_tcb.

  • ima_hash — дайджест-алгоритм IMA. Значение по умолчанию — sha1.

  • ima_template

    • ima — шаблон для расширения измерений IMA.

    • ima-ng — шаблон для расширения измерений IMA.

    • ima-sig — шаблон для расширения измерений IMA.

    • integrity_audit

      Возможные значения:

      • 0 — базовые сведения об аудите целостности (по умолчанию).

      • 1 — дополнительные сведения об аудите целостности.

Параметр ima_policy может одновременно указывать несколько значений, например ima_policy=tcb|appraise_tcb. После запуска системы ее политика IMA представляет собой сумму политик для двух параметров.

Политика IMA для параметра запуска ima_policy=tcb выглядит следующим образом.

# PROC_SUPER_MAGIC = 0x9fa0
dont_measure fsmagic=0x9fa0
# SYSFS_MAGIC = 0x62656572
dont_measure fsmagic=0x62656572
# DEBUGFS_MAGIC = 0x64626720
dont_measure fsmagic=0x64626720
# TMPFS_MAGIC = 0x01021994
dont_measure fsmagic=0x1021994
# DEVPTS_SUPER_MAGIC=0x1cd1
dont_measure fsmagic=0x1cd1
# BINFMTFS_MAGIC=0x42494e4d
dont_measure fsmagic=0x42494e4d
# SECURITYFS_MAGIC=0x73636673
dont_measure fsmagic=0x73636673
# SELINUX_MAGIC=0xf97cff8c
dont_measure fsmagic=0xf97cff8c
# SMACK_MAGIC=0x43415d53
dont_measure fsmagic=0x43415d53
# CGROUP_SUPER_MAGIC=0x27e0eb
dont_measure fsmagic=0x27e0eb
# CGROUP2_SUPER_MAGIC=0x63677270
dont_measure fsmagic=0x63677270
# NSFS_MAGIC=0x6e736673
dont_measure fsmagic=0x6e736673
measure func=MMAP_CHECK mask=MAY_EXEC
measure func=BPRM_CHECK mask=MAY_EXEC
measure func=FILE_CHECK mask=MAY_READ uid=0
measure func=MODULE_CHECK
measure func=FIRMWARE_CHECK

Политика IMA для параметра запуска ima_policy=tcb_appraise выглядит следующим образом.

# PROC_SUPER_MAGIC = 0x9fa0
dont_appraise fsmagic=0x9fa0
# SYSFS_MAGIC = 0x62656572
dont_appraise fsmagic=0x62656572
# DEBUGFS_MAGIC = 0x64626720
dont_appraise fsmagic=0x64626720
# TMPFS_MAGIC = 0x01021994
dont_appraise fsmagic=0x1021994
# RAMFS_MAGIC
dont_appraise fsmagic=0x858458f6
# DEVPTS_SUPER_MAGIC=0x1cd1
dont_appraise fsmagic=0x1cd1
# BINFMTFS_MAGIC=0x42494e4d
dont_appraise fsmagic=0x42494e4d
# SECURITYFS_MAGIC=0x73636673
dont_appraise fsmagic=0x73636673
# SELINUX_MAGIC=0xf97cff8c
dont_appraise fsmagic=0xf97cff8c
# SMACK_MAGIC=0x43415d53
dont_appraise fsmagic=0x43415d53
# NSFS_MAGIC=0x6e736673
dont_appraise fsmagic=0x6e736673
# CGROUP_SUPER_MAGIC=0x27e0eb
dont_appraise fsmagic=0x27e0eb
# CGROUP2_SUPER_MAGIC=0x63677270
dont_appraise fsmagic=0x63677270
appraise fowner=0

Политика IMA для параметра запуска ima_policy=secure_boot выглядит следующим образом.

appraise func=MODULE_CHECK appraise_type=imasig
appraise func=FIRMWARE_CHECK appraise_type=imasig
appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig
appraise func=POLICY_CHECK appraise_type=imasig

Параметры запуска дайджест-списков IMA

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

  • integrity

    Возможные значения:

    • 0 — отключение функции IMA (по умолчанию).

    • 1 — включение функции IMA.

  • ima_appraise

    Возможные значения:

    • off — отключение режима оценки IMA.

    • enforce-evm — включение режима принудительной оценки IMA при выполнении проверки целостности во время обращения к файлу.

  • ima_appraise_digest_list

    Возможные значения:

    • digest — если EVM отключен, для оценки IMA используется абстрактный список. Абстрактный список защищает как содержимое, так и расширенные атрибуты файла.

    • digest-nometadata — если хеш-значение EVM не существует, проверка целостности выполняется только на основе хеш-значения IMA (расширенный атрибут файла не защищен).

  • evm

    Возможные значения:

    • fix — разрешение на внесение любых изменений в расширенный атрибут (даже если изменение ведет к невозможности проверки целостности расширенного атрибута).

    • ignore — разрешение на внесение изменений в расширенный атрибут, только если он не существует или некорректен.

  • ima_policy

    Возможные значения:

    • exec_tcb — политика измерения IMA. Дополнительные сведения см. в приведенном ниже описании политики.

    • appraise_exec_tcb — политика оценки IMA. Дополнительные сведения см. в приведенном ниже описании политики.

    • appraise_exec_immutable — политика оценки IMA. Дополнительные сведения см. в приведенном ниже описании политики.

  • ima_digest_list_pcr

    Возможные значения:

    • 11 — использование PCR 11 вместо PCR 10, а для измерения используется только дайджест-список.

    • +11 — измерение PCR 10 зарезервировано. Результаты измерений записываются в микросхему TPM, если она доступна.

  • initramtmpfs — добавление поддержки для tmpfs.

Политика IMA для параметра запуска ima_policy=exec_tcb выглядит следующим образом.

dont_measure fsmagic=0x9fa0
dont_measure fsmagic=0x62656572
dont_measure fsmagic=0x64626720
dont_measure fsmagic=0x1cd1
dont_measure fsmagic=0x42494e4d
dont_measure fsmagic=0x73636673
dont_measure fsmagic=0xf97cff8c
dont_measure fsmagic=0x43415d53
dont_measure fsmagic=0x27e0eb
dont_measure fsmagic=0x63677270
dont_measure fsmagic=0x6e736673
measure func=MMAP_CHECK mask=MAY_EXEC
measure func=BPRM_CHECK mask=MAY_EXEC
measure func=MODULE_CHECK
measure func=FIRMWARE_CHECK
measure func=POLICY_CHECK
measure func=DIGEST_LIST_CHECK
measure parser

Политика IMA для параметра запуска ima_policy=appraise_exec_tcb выглядит следующим образом.

appraise func=MODULE_CHECK appraise_type=imasig
appraise func=FIRMWARE_CHECK appraise_type=imasig
appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig
appraise func=POLICY_CHECK appraise_type=imasig
appraise func=DIGEST_LIST_CHECK appraise_type=imasig
dont_appraise fsmagic=0x9fa0
dont_appraise fsmagic=0x62656572
dont_appraise fsmagic=0x64626720
dont_appraise fsmagic=0x858458f6
dont_appraise fsmagic=0x1cd1
dont_appraise fsmagic=0x42494e4d
dont_appraise fsmagic=0x73636673
dont_appraise fsmagic=0xf97cff8c
dont_appraise fsmagic=0x43415d53
dont_appraise fsmagic=0x6e736673
dont_appraise fsmagic=0x27e0eb
dont_appraise fsmagic=0x63677270

Политика IMA для параметра запуска ima_policy=appraise_exec_immutable выглядит следующим образом.

appraise func=BPRM_CHECK appraise_type=imasig appraise_type=meta_immutable
appraise func=MMAP_CHECK
appraise parser appraise_type=imasig

Параметры компиляции ядра IMA

Собственный механизм IMA предоставляет следующие параметры компиляции.

Параметр компиляции Описание

CONFIG_EVM

Параметр компиляции EVM

CONFIG_IMA_APPRAISE

Параметр компиляции для оценки IMA

CONFIG_IMA_LSM_RULES

Разрешение настраивать правила LSM

CONFIG_IMA_MEASURE_PCR_IDX

Разрешение задавать номер PCR для измерения IMA

CONFIG_IMA_WRITE_POLICY

Разрешение обновлять политику IMA на этапе выполнения

CONFIG_IMA

Параметр компиляции IMA

CONFIG_INTEGRITY_ASYMMETRIC_KEYS

Включение проверки асимметричной подписи IMA

CONFIG_INTEGRITY_AUDIT

Компиляция модуля аудита IMA

CONFIG_INTEGRITY_SIGNATURE

Включение проверки подписей IMA

CONFIG_INTEGRITY_TRUSTED_KEYRING

Включение набора ключей IMA/EVM

CONFIG_INTEGRITY

Параметр компиляции IMA/EVM

IMA_APPRAISE_BOOTPARAM

Включение параметров запуска оценки IMA

Ниже приведены дополнительные параметры компиляции, предоставляемые расширением IMA Digest Lists.

Параметр компиляции Описание

CONFIG_DIGEST_LIST

Включение функции дайджест-списков IMA

Эталонные данные о производительности IMA

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

image$ima performance

Влияние IMA на сервис kdump

Когда включен принудительный режим IMA и в политике настроена проверка системных вызовов kexec, kdump может не запускаться.

appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig

Причина сбоя при запуске kdump: после включения IMA нужно проверить целостность файлов. Поэтому системный вызов kexec_file_load ограничен, когда kdump загружает файлы образов ядра. Можно изменить KDUMP_FILE_LOAD в файле конфигурации /etc/sysconfig/kdump, чтобы включить системный вызов kexec_file_load.

KDUMP_FILE_LOAD="on"

При этом сам системный вызов kexec_file_load также проверяет подпись файла. Таким образом, загруженный файл образа ядра должен содержать правильную подпись безопасной загрузки, а текущее ядро должно содержать соответствующий сертификат проверки.

Удаленная аттестация (Kunpeng Security Library)

Введение

В рамках этого проекта разрабатываются базовые программные компоненты безопасности, выполняющиеся на процессорах Kunpeng. На начальном этапе особое внимание в рамках этого проекта уделяется областям доверенных вычислений, таким как удалённая аттестация, чтобы расширить возможности разработчиков систем безопасности в сообществе.

Архитектура программного обеспечения

image$ra arch

Установка и настройка

  1. Выполните следующую команду, чтобы использовать пакет RPM программы установки YUM:

    yum install kunpengsecl-ras kunpengsecl-rac kunpengsecl-rahub
  2. Подготовьте среду базы данных.

    1. Перейдите в каталог /usr/share/attestation/ras/.

    2. Запустите скрипт prepare-database-env.sh для автоматической настройки среды базы данных.

  3. Файлы конфигурации, необходимые для работы программы, хранятся по трем путям:

    • текущему пути ./config.yaml;

    • домашнему пути ${HOME}/.config/attestation/ras(rac)(rahub)/config.yaml;

    • системному пути /etc/attestation/ras(rac)(rahub)/config.yaml.

  4. (Необязательно) Чтобы создать файл конфигурации домашнего каталога, запустите скрипт prepare-ras(rac)(hub)conf-env.sh в /usr/share/attestation/ras(rac)(rahub) после установки пакета RPM.

Параметры

Параметры загрузки RAS

Выполните команду ras, чтобы запустить программу RAS. Обратите внимание, что вам нужно предоставить открытый ключ ECDSA в текущем каталоге и назвать его ecdsakey.pub. Доступны следующие параметры:

-H, --https

HTTP/HTTPS mode switch. The default value is https (true), false=http.

-h --hport

RESTful API port listened by RAS in HTTPS mode.

-p, --port string

Client API port listened by RAS.

-r, --rest string

RESTful API port listened by RAS in HTTP mode.

-T, --token

Generates a verification code for test and exits.

-v, --verbose

Prints more detailed RAS runtime log information.

-V, --version

Prints the RAS version and exits.

Параметры загрузки RAC

Выполните команду sudo raagent, чтобы запустить программу RAC. Обратите внимание, что для включения физического модуля TPM требуется разрешение sudo. Доступны следующие параметры:

-s, --server string

Specifies the RAS service port to be connected.

-t, --test

Starts in test mode.

-v, --verbose

Prints more detailed RAC runtime log information.

-V, --version

Prints the RAC version and exits.

-i, --imalog

Specifies the path of the IMA file.

-b, --bioslog

Specifies the path of the BIOS file.

Определение API

Чтобы облегчить администратору задачу по управлению целевым сервером и RAS, доступны следующие API, предназначенные для вызова:

API URL Методы

/

GET

/{id}

GET, POST, DELETE

/{from}/{to}

GET

/{id}/reports

GET

/{id}/reports/{reportid}

GET, DELETE

{id}/basevalues

GET

{id}/newbasevalue

POST

{id}/basevalues/{basevalueid}

GET, POST, DELETE

version

GET

config

GET, POST

{id}/container/status

GET

{id}/device/status

GET

Порядок использования указанных выше API:

Чтобы запросить информацию обо всех серверах, используйте /.

curl -X GET -H "Content-Type: application/json" http://localhost:40002/

Чтобы запросить подробную информацию о целевом сервере, используйте метод GET для /{id}. {id} — это уникальный идентификатор, назначаемый RAS целевому серверу.

curl -X GET -H "Content-Type: application/json" http://localhost:40002/1

Чтобы изменить информацию о целевом сервере, используйте метод POST для /{id}. $AUTHTOKEN — это код проверки подлинности, автоматически сгенерированный при выполнении команды ras -T.

type clientInfo struct {
	Registered   *bool `json:"registered"`  // Registration status of the target server
	IsAutoUpdate *bool `json:"isautoupdate"`// Target server base value update policy
}
curl \
   -X POST \
   -H "Authorization: $AUTHTOKEN" \
   -H "Content-Type: application/json" http://localhost:40002/1 \
   -d '{"registered":false, "isautoupdate":false}'

Чтобы удалить целевой сервер, используйте метод DELETE для /{id}.

Этот метод не удаляет всю информацию о целевом сервере. Вместо этого он устанавливает false в качестве состояния регистрации целевого сервера.

curl -X DELETE -H "Authorization: $AUTHTOKEN" -H "Content-Type: application/json" http://localhost:40002/1

Чтобы запросить информацию обо всех серверах в указанном диапазоне, используйте метод GET для /{from}/{to}.

curl -X GET -H "Content-Type: application/json" http://localhost:40002/1/9

Чтобы запросить все отчеты о доверии целевого сервера, используйте метод GET для /{id}/reports.

curl -X GET -H "Content-Type: application/json" http://localhost:40002/1/reports

Чтобы запросить сведения об указанном отчете о доверии целевого сервера, используйте метод GET для /{id}/reports/{reportid}. {reportid} указывает уникальный идентификатор, назначаемый RAS отчету о доверии целевого сервера.

curl \
   -X GET \
   -H "Content-Type: application/json" \
   http://localhost:40002/1/reports/1

Чтобы удалить указанный отчет о доверии целевого сервера, используйте метод DELETE для /{id}/reports/{reportid}.

Этот метод удалит всю информацию об указанном отчете о доверии, и этот отчет нельзя будет запросить через API.
curl \
   -X DELETE \
   -H "Authorization: $AUTHTOKEN" \
   -H "Content-Type: application/json" \
   http://localhost:40002/1/reports/1

Чтобы запросить все базовые значения целевого сервера, используйте метод GET для /{id}/reports/{reportid}.

curl \
   -X GET \
   -H "Content-Type: application/json" \
   http://localhost:40002/1/basevalues

Чтобы добавить базовое значение на целевой сервер, используйте метод POST для /{id}/newbasevalue.

type baseValueJson struct {
	BaseType   string `json:"basetype"`   // Base value type
	Uuid       string `json:"uuid"`       // ID of a container or device
	Name       string `json:"name"`       // Base value name
	Enabled    bool   `json:"enabled"`    // Whether the base value is available
	Pcr        string `json:"pcr"`        // PCR value
	Bios       string `json:"bios"`       // BIOS value
	Ima        string `json:"ima"`        // IMA value
	IsNewGroup bool   `json:"isnewgroup"` // Whether this is a group of new reference values
}
curl \
   -X POST \
   -H "Authorization: $AUTHTOKEN" \
   -H "Content-Type: application/json" \
   http://localhost:40002/1/newbasevalue \
   -d '{"name":"test", "basetype":"host", "enabled":true, "pcr":"testpcr", "bios":"testbios", "ima":"testima", "isnewgroup":true}'

Чтобы запросить сведения об указанном базовом значении целевого сервера, используйте метод GET для /{id}/basevalues/{basevalueid}. {basevalueid} указывает уникальный идентификатор, назначаемый RAS для указанного базового значения целевого сервера.

curl \
   -X GET \
   -H "Content-Type: application/json" \
   http://localhost:40002/1/basevalues/1

Чтобы изменить состояние доступности указанного базового значения целевого сервера, используйте метод POST для /{id}/basevalues/{basevalueid}.

curl \
   -X POST \
   -H "Content-type: application/json" \
   -H "Authorization: $AUTHTOKEN" \
   http://localhost:40002/1/basevalues/1 \
   -d '{"enabled":true}'

Чтобы удалить указанное базовое значение целевого сервера, используйте метод DELETE для /{id}/basevalues/{basevalueid}.

Этот метод удалит всю информацию об указанном базовом значении, и базовое значение нельзя будет запросить через API.
curl \
   -X DELETE \
   -H "Authorization: $AUTHTOKEN" \
   -H "Content-Type: application/json" \
   http://localhost:40002/1/basevalues/1

Чтобы получить информацию о версии программы, используйте метод GET для /version.

curl -X GET -H "Content-Type: application/json" http://localhost:40002/version

Чтобы запросить информацию о конфигурации целевого сервера, RAS или базы данных, используйте метод GET для /config.

curl -X GET -H "Content-Type: application/json" http://localhost:40002/config

Чтобы изменить информацию о конфигурации целевого сервера, RAS или базы данных, используйте метод POST для /config.

type cfgRecord struct {
	// Target server configuration
	HBDuration      string `json:"hbduration" form:"hbduration"`
	TrustDuration   string `json:"trustduration" form:"trustduration"`
	DigestAlgorithm string `json:"digestalgorithm" form:"digestalgorithm"`
	// RAS configuration
	MgrStrategy     string `json:"mgrstrategy" form:"mgrstrategy"`
	ExtractRules    string `json:"extractrules" form:"extractrules"`
	IsAllupdate     *bool  `json:"isallupdate" form:"isallupdate"`
	LogTestMode     *bool  `json:"logtestmode" form:"logtestmode"`
}
curl \
   -X POST \
   -H "Authorization: $AUTHTOKEN" \
   -H "Content-Type: application/json" \
   http://localhost:40002/config \
   -d '{"hbduration":"5s","trustduration":"20s","DigestAlgorithm":"sha256"}'

Часто задаваемые вопросы

Почему нельзя запустить RAS после установки?

В текущей логике проектирования RAS после запуска программы необходимо найти файл ecdsakey.pub в текущем каталоге и считать этот файл в качестве кода проверки подлинности для доступа к программе. Если этот файл не существует в текущем каталоге, во время загрузки RAS выводится сообщение об ошибке.

Решение 1.

Выполните команду ras -T, чтобы создать тестовый токен. Создается файл ecdsakey.pub.

Решение 2.

После развёртывания сервиса проверки подлинности OAuth2 сохраните открытый ключ проверки генератора токенов JWT как ecdsakey.pub.

Почему нельзя получить доступ к RAS через REST API после запуска?

По умолчанию RAS запускается в режиме HTTPS. Поэтому для доступа к RAS необходимо предоставить действительный сертификат. Однако программа RAS, запущенная в режиме HTTP, не требует сертификат.