Доверенные вычисления
Основы концепции доверенных вычислений
Описание доверенных вычислений
Разные международные организации трактуют термин «доверие» или «доверенный» по-разному.
-
Организация Trusted Computing Group (TCG):
Сущность, которой доверяют, всегда достигает желаемой цели ожидаемым образом.
-
Международная организация по стандартизации (ISO) и Международная электротехническая комиссия (МЭК) (1999 г.):
Задействованные в вычислениях компоненты, операции или процессы предсказуемы при любых условиях и устойчивы к вирусам и определенной степени физических помех.
-
Технический комитет компьютерного общества 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) для вычисления хеш-значений содержимого файла и расширенных атрибутов, а также поиска по хеш-таблице ядра. Если вычисленные хеш-значения совпадают с указанными в таблице, выдается разрешение на выполнение файла. В противном случае доступ будет запрещен.

Расширение 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 являются лишь звеном в цепи доверия доверенных вычислений и не могут обеспечить безопасность системы в одиночку. Выстраивание системы безопасности всегда требует систематического подхода, основанного на эшелонированной защите.
Ограничения
-
Текущий режим оценки IMA может защищать только неизменяемые файлы в системе, включая исполняемые файлы и файлы динамических библиотек.
-
IMA обеспечивает измерение целостности на прикладном уровне. Безопасность IMA зависит от надежности предыдущих звеньев.
-
В настоящее время IMA не поддерживает импорт дайджест-списков сторонних приложений.
-
Журнал запуска может содержать сообщение
Unable to open file: /etc/keys/x509_ima.der(Не удалось открыть файл:/etc/keys/x509_ima.der). Об этой ошибке сообщает сообщество открытого кода, и она не влияет на использование функции дайджест-списков IMA. -
В версии 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
Содержание каждой записи слева направо:
-
PCR: регистр ПЦР для расширения результатов измерений (значение по умолчанию —
10, этот регистр функционирует, только если в системе установлена микросхема TPM). -
Хеш-значение шаблона: хеш-значение, которое в конечном итоге используется для расширения, объединяя хеш содержимого файла, длину и значение пути к файлу.
-
Шаблон: шаблон расширенного значения измерения, например
ima-ng. -
Хеш-значение содержимого файла: хеш-значение измеренного содержимого файла.
-
Путь к файлу: путь к измеренному файлу.
Оценка IMA
Целью оценки IMA является контроль доступа к локальным файлам путем сравнения эталонного значения со стандартным эталонным значением.
IMA использует атрибуты расширения security.ima и security.evm для хранения эталонных значений измерения целостности файлов.
-
security.ima: хранит хеш-значение содержимого файла; -
security.evm: хранит подпись хеш-значения расширенного атрибута файла.
При обращении к защищенному файлу срабатывает перехватчик в ядре для проверки целостности расширенных атрибутов и содержимого файла.
-
Используйте открытый ключ в наборе ключей ядра, чтобы проверить значение подписи в расширенном атрибуте файла
security.evm, и сравните это значение подписи с хеш-значением расширенного атрибута текущего файла. Если они совпадают, расширенный атрибут файла является полным (включаяsecurity.ima). -
Когда расширенный атрибут файла является полным, система сравнивает расширенный атрибут файла
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
-
Настройте параметры ядра для перехода в режим журнала.
-
Добавьте следующие параметры, чтобы отредактировать файл
/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, чтобы перезагрузить систему и войти в режим журнала. В этом режиме включена проверка целостности, однако систему можно запустить, даже если эта проверка не пройдена.
-
-
Установите пакеты зависимостей.
-
Выполните команду
yum, чтобы установитьdigest-list-toolsиima-evm-utils:yum install digest-list-tools ima-evm-utils -
Убедитесь, что установленные пакеты имеют версии не ниже указанных:
Команда проверки:
rpm -qa | grep <пакет>Ожидаемые результаты вывода:
digest-list-tools-0.3.93-1.oe1.x86_64 ima-evm-utils-1.2.1-9.oe1.x86_64
-
-
Если пакет установлен
plymouth, нужно добавить-aв конец командыcpв строке 147 файла скрипта/usr/libexec/plymouth/plymouth-populate-initrd:... ddebug "Installing $_src" cp -a --sparse=always -pfL "$PLYMOUTH_SYSROOT$_src" "${initdir}/$target" -
Выполните
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; -
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-<пакет>-<версия>.
Часто задаваемые вопросы
Почему не запускается система, не выполняются команды либо сервисы работают неправильно после запуска системы в принудительном режиме?
В принудительном режиме 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/.
|
| Путь | Разрешение | Описание |
|---|---|---|
|
600 |
Интерфейс политики IMA |
|
440 |
Результат измерения IMA в формате кода ASCII |
|
440 |
Результат измерения IMA в двоичном формате |
|
440 |
Статистика результатов измерений |
|
440 |
Число конфликтов среди результатов измерений IMA |
|
660 |
Режим EVM, то есть режим проверки целостности расширенных атрибутов файлов |
Значения /sys/kernel/security/evm приведены ниже.
-
0— EVM не инициализирован. -
1— использует HMAC (симметричное шифрование) для проверки целостности расширенных атрибутов. -
2— использует подпись открытого ключа (асимметричное шифрование) для проверки целостности расширенных атрибутов. -
6— отключает проверку целостности расширенных атрибутов (этот режим используется для openEuler).
Ниже приведены дополнительные интерфейсы securityfs, предоставляемые расширением IMA Digest Lists.
| Путь | Разрешение | Описание |
|---|---|---|
|
440 |
Общее количество хешей (IMA+EVM) в хеш-таблице системы |
|
200 |
Новые интерфейсы в дайджест-списке |
|
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 (суть изменения заключается в создании временного файла и последующем его переименовании). Измерение IMAMAY_WRITEне запускается при каждом изменении файла. -
MAY_READ— считывание файла. -
MAY_APPEND— расширение атрибутов файла.
-
-
fsmagic— шестнадцатеричное магическое число типа файловой системы. -
fsuuid— UUID системного устройства. Значение представляет собой шестнадцатеричную строку из 16 символов. -
fowner— идентификатор владельца файла. -
uid— идентификатор пользователя, который работает с файлом. -
obj_type— тип файла (на основе тега SELinux). -
pcr— выбор PCR, используемого для расширения значений измерений в TPM. Значение по умолчанию —10. -
appraise_type-
imasig— оценка IMA на основе подписей. -
meta_immutable— оценка расширенных атрибутов файла на основе подписей (с поддержкой дайджест-списка).
-
|
Значение |
Параметры запуска собственного механизма 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 для параметра запуска 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 предоставляет следующие параметры компиляции.
| Параметр компиляции | Описание |
|---|---|
|
Параметр компиляции EVM |
|
Параметр компиляции для оценки IMA |
|
Разрешение настраивать правила LSM |
|
Разрешение задавать номер PCR для измерения IMA |
|
Разрешение обновлять политику IMA на этапе выполнения |
|
Параметр компиляции IMA |
|
Включение проверки асимметричной подписи IMA |
|
Компиляция модуля аудита IMA |
|
Включение проверки подписей IMA |
|
Включение набора ключей IMA/EVM |
|
Параметр компиляции IMA/EVM |
|
Включение параметров запуска оценки IMA |
Ниже приведены дополнительные параметры компиляции, предоставляемые расширением IMA Digest Lists.
| Параметр компиляции | Описание |
|---|---|
|
Включение функции дайджест-списков IMA |
Эталонные данные о производительности IMA
На следующем рисунке сравнивается производительность при отключенном IMA, включенном собственном механизме IMA и включенных дайджест-списках IMA.

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