Основы концепции доверенных вычислений#
Описание доверенных вычислений#
Разные международные организации трактуют термин “доверие” или “доверенный” по-разному.
-
Организация 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 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
-
Если пакет установлен 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
- 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.
Часто задаваемые вопросы#
-
Почему не запускается система, не выполняются команды либо сервисы работают неправильно после запуска системы в принудительном режиме?
В принудительном режиме 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 | 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.
Влияние 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. На начальном этапе особое внимание в рамках этого проекта уделяется областям доверенных вычислений, таким как удаленная аттестация, чтобы расширить возможности разработчиков систем безопасности в сообществе.
Архитектура программного обеспечения#
Установка и настройка#
- Выполните следующую команду, чтобы использовать пакет 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 | Метод |
---|---|
/ | 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, не требует сертификат.