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

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

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

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

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

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

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

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

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

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

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

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

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

Архитектура проверки целостности (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. Дайджест-списки при их создании подписываются с помощью закрытого ключа. При выгрузке в ядро через интерфейс дайджест-списки требуется проверять с помощью открытого ключа в ядре.

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

1599719649188

Расширение 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. Настройте параметры ядра для перехода в режим журнала.

    Добавьте следующие параметры, чтобы отредактировать файл /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
    

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

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

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

    $ yum install digest-list-tools ima-evm-utils
    $ rpm -qa | grep digest-list-tools
    digest-list-tools-0.3.93-1.oe1.x86_64
    $ rpm -qa | grep ima-evm-utils
    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
    

    Отредактируйте файл /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
    

    Выполните команду reboot, чтобы завершить первоначальное развертывание.

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

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

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

  • digest-list-tools
  • pesign-obs-integration
  • selinux-policy
  • rpm
  • openEuler-rpm-config

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

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.

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

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

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

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

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

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

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

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

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

    $ dmesg | grep appraise
    
  2. Почему осуществляется контроль доступа к системным файлам в принудительном режиме?

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

    $ cat /proc/cmdline
    ...ima_policy=exec_tcb|appraise_exec_tcb|appraise_exec_immutable...
    

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

    $ cat /sys/kernel/security/ima/policy
    

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

  3. Нужно ли после завершения первоначального развертывания вручную выполнять команду 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 fsmagic=xxx Шестнадцатеричное магическое число типа файловой системы
fsuuid fsuuid=xxx UUID системного устройства. Значение представляет собой шестнадцатеричную строку из 16 символов.
fowner fowner=xxx Идентификатор владельца файла
uid uid=xxx Идентификатор пользователя, который работает с файлом
obj_type obj_type=xxx_t Тип файла (на основе тега SELinux)
pcr 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 None Эквивалентно ima_policy=tcb.
ima_appraise_tcb None Эквивалентно ima_policy=appraise_tcb.
ima_hash sha1/md5/… Дайджест-алгоритм 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 None Добавление поддержки для 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_INTEGRITY Параметр компиляции IMA/EVM
CONFIG_INTEGRITY_SIGNATURE Включение проверки подписей IMA
CONFIG_INTEGRITY_ASYMMETRIC_KEYS Включение проверки асимметричной подписи IMA
CONFIG_INTEGRITY_TRUSTED_KEYRING Включение набора ключей IMA/EVM
CONFIG_INTEGRITY_AUDIT Компиляция модуля аудита IMA
CONFIG_IMA Параметр компиляции IMA
CONFIG_IMA_WRITE_POLICY Разрешение обновлять политику IMA на этапе выполнения
CONFIG_IMA_MEASURE_PCR_IDX Разрешение задавать номер PCR для измерения IMA
CONFIG_IMA_LSM_RULES Разрешение настраивать правила LSM
CONFIG_IMA_APPRAISE Параметр компиляции для оценки IMA
IMA_APPRAISE_BOOTPARAM Включение параметров запуска оценки IMA
CONFIG_EVM Параметр компиляции EVM

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

Параметр компиляции Описание
CONFIG_DIGEST_LIST Включение функции дайджест-списков IMA

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

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

img

Влияние 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. Cause of the kdump startup failure: After IMA is enabled, file integrity needs to be verified. Therefore, the kexec_file_load system call is restricted when kdump loads kernel image files. You can modify KDUMP_FILE_LOAD in the /etc/sysconfig/kdump configuration file to enable the kexec_file_load system call.

KDUMP_FILE_LOAD="on"

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

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

Введение#

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

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

img

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

  1. Выполните следующую команду, чтобы использовать пакет RPM программы установки YUM:
$ yum install kunpengsecl-ras kunpengsecl-rac kunpengsecl-rahub
  1. Подготовьте среду базы данных. Перейдите в каталог /usr/share/attestation/ras и запустите скрипт prepare-database-env.sh для автоматической настройки среды базы данных.
  2. Файлы конфигурации, необходимые для работы программы, хранятся по трем путям: текущему пути ./config.yaml, домашнему пути ${HOME}/.config/attestation/ras(rac)(rahub)/config.yaml и системному пути /etc/attestation/ras(rac)(rahub)/config.yaml.
  3. (Необязательно) Чтобы создать файл конфигурации домашнего каталога, запустите скрипт 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 Метод
/ 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"}'

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

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

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

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

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

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

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