9. КОНТРОЛЬ ЦЕЛОСТНОСТИ
9.1. Контроль целостности установленных RPM-пакетов
В процессе установки RPM-пакетов пакетный менеджер сохраняет в свою внутреннюю базу данных различную информацию о файлах и каталогах, которые входят в состав пакета: права доступа, сведения о владельце, размер, контрольную сумму и т.д.
Используя эти данные, команда rpm --verify
позволяет проверить целостность
установленных RPM-пакетов. Для вызова команды используется следующий синтаксис:
rpm {--verify|-V} <пакет | параметры_выборки> [параметры_проверки]
Где:
опция
--verify
или её краткая форма-V
переводит пакетный менеджерrpm
в режим проверки целостности;пакет
— название RPM-пакета, также можно использовать подробный форматназвание[-версия[-релиз]][.архитектура]
(примеры:bash-5.1.8
,bash-5.1.8-9.el9
,bash-5.1.8-9.el9.x86_64
).В качестве альтернативы указанию имени пакета можно использовать большинство опций
rpm
, предназначенных для поиска/фильтрации пакетов. Полный список поддерживаемых опций доступен в соответствующей документации (man 8 rpm
), а в данном руководстве рассмотрим две опции, которые представляют наибольший интерес в контексте верификации пакетов.-a, --all [условие]
— выполнить проверку всех установленных RPM-пакетов, либо всех пакетов, соответствующихусловию
, если оно определено.Условие
определяется в форматетег=шаблон
, например можно использовать командуrpm -V -a name=krb5*
для проверки всех пакетов, имя которых начинается сkrb5
. Существует возможность задать несколько условий, используя несколько аргументов-a
— в таком случае будут обработаны только те пакеты, которые соответствуют всем заданным критериям.-f, --file <файл>
— выполнить проверку пакета, которому принадлежит указанный файл.
по умолчанию команда
rpm --verify
выполняет все проверки пакета, но с помощью следующихпараметров проверки
можно отключить те или иные тесты:--nodeps
— не выполнять проверку зависимостей пакетов;--nodigest
— не выполнять проверку контрольных сумм пакета и/или его заголовков;--nofiles
— отключить проверку атрибутов файлов;--noscripts
— не выполнять секцию%verifyscript
RPM-пакета если она определена;--nosignature
— не проверять подписи пакета и его заголовков;--nolinkto
— не проверять атрибуты ссылок;--nofiledigest
— не проверять контрольные суммы файлов пакета;--nosize
— не проверять размер файла;--nouser
— не выполнять проверку на изменение пользователя владельца файла;--nogroup
— не выполнять проверку на изменение группы владельца файла;--nomtime
— не проверять время последнего изменения файла;--nomode
— не проверять права доступа к файлу;--nordev
— не проверять атрибутrdev
(тип устройства) для файлов устройств;--nocaps
— не проверять разрешения (capabilities) файла.
По умолчанию команда rpm --verify
выводит на консоль построчный список файлов,
для которых как минимум одна из проверок завершилась неудачно. Используется
следующий формат вывода:
......... [тип] путь_к_файлу
Строка начинается с девяти ячеек, каждая из которых отображает статус определённой проверки. Ячейка может принимать значение одного из следующих типов:
.
— означает, что проверка пройдена успешно;?
— означает, что проверку не удалось выполнить по каким-то причинам (например, отсутствуют права на чтение файла);один из указанных ниже символов, в таком случае это означает, что соответствующая проверка завершилась неудачей:
S
— размер файла отличается;M
— права доступа или тип файла отличаются;5
— контрольная сумма файла не соответствует эталонной;D
— старший (major) или младший (minor) номер устройства отличается;L
— путь, на который ссылается ссылка, не соответствует ожидаемому;U
— отличается пользователь — владелец файла;G
— отличается группа — владелец файла;T
— отличается время последнего изменения файла;P
— разрешения (capabilities) файла не соответствуют ожидаемым.
В случае если проверяемый файл является специальным с точки зрения пакетного менеджера RPM, после девяти ячеек со статусом будет указан тип файла.
c
— конфигурационный файл (перечислен в блоке%config
spec-файла RPM-пакета);d
— файл с документацией (перечислен в блоке%doc
spec-файла);g
— так называемый «призрачный» файл (перечислен в блоке%ghost
spec-файла), это означает что содержимое файла не является частью данного пакета;l
— файл с лицензионным соглашением (перечислен в блоке%license
spec-файла);r
— файл README (перечислен в блоке%readme
spec-файла).
Для обычных файлов или каталогов тип не указывается.
В конце строки вывода находится путь к файлу, который не прошёл проверку.
Если все пакеты и включённые в них файлы прошли проверку, команда rpm --verify
вернёт код возврата 0
, в противном случае код возврата будет ненулевым.
Далее, рассмотрим несколько реальных примеров работы с утилитой.
Успешная проверка пакета
bash
:$ sudo rpm -V bash $ echo $? 0
Изменений не обнаружено, код возврата —
0
.Проверка всех пакетов, имена которых начинаются с
krb5
, обнаруживает изменения в файле/etc/krb5.conf
:$ sudo rpm -V -a krb5* S.5...... c /etc/krb5.conf S.5...... c /etc/krb5.conf $ echo $? 1
Статус
S
в первой ячейке означает, что фактический размер файла отличается от ожидаемого, а статус5
в третьей ячейке — что контрольная сумма файла отличается от эталонной. Данный файл является конфигурационным (статусc
перед именем файла) и обнаруженное несоответствие считается нормальным, если вы изменяли файл в процессе настройки системы. Поскольку один из файлов был изменён, код возврата ненулевой. Проверка выполняется последовательно для каждого отдельного пакета, подходящего под условие. В этом примере файл/etc/krb5.conf
принадлежит как 32-битному, так и 64-битному варианту пакетаkrb5-libs
и, соответственно, информация об этом файле выводится два раза:$ rpm -qf /etc/krb5.conf krb5-libs-1.21.1-4.el9_5.x86_64 krb5-libs-1.21.1-4.el9_5.i686
9.2. Программа для контроля целостности AIDE
aide
(Advanced Intrusion Detection Environment) — это программа для проверки
целостности файлов.
Принцип работы данного инструмента заключается в следующем: по требованию администратора aide создаёт базу данных, которая содержит различную информацию о файлах в системе и при последующих запусках утилиты выполняется проверка текущего состояния отслеживаемых файлов на предмет соответствия эталонному. В случае выявления отклонений генерируется соответствующий отчёт.
Утилита aide
обладает следующими возможностями:
поддерживает хранение в БД и отслеживание изменения различных атрибутов файлов: тип файла, права доступа, номер индексного дескриптора (inode), владельца и группу файла, размер, время последнего изменения файла (mtime), время последнего изменения его метаданных/содержимого (ctime), время последнего доступа к файлу (atime), количество ссылок на файл и т.п.
создаёт и проверяет контрольные суммы с использованием различных хеш-функций: SHA256, SHA512, SHA1, MD5 и т.д.
отслеживает изменение расширенных атрибутов файлов: Posix ACL, SELinux, xattr, e2fsattrs.
автоматический запуск через
systemd
таймеры илиcron
с отправкой уведомлений по электронной почте.
9.2.1. Установка и первичная настройка aide
Для установки aide
выполните следующую команду:
$ sudo dnf install -y aide
В конфигурации по умолчанию aide
проверяет лишь некоторый набор файлов и
каталогов, определённый в конфигурационном файле /etc/aide.conf
. Для
отслеживания изменения в других файлах и каталогах вам потребуется внести
соответствующие правки в конфигурационный файл перед инициализацией базы данных
aide
. Полная информация о настройке программы находится на соответствующей странице документации man aide.conf
.
Для инициализации базы данных выполните следующую команду:
$ sudo aide --init
Start timestamp: 2025-01-16 12:54:34 +0300 (AIDE 0.16)
AIDE initialized database at /var/lib/aide/aide.db.new.gz
Number of entries: 204419
---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------
/var/lib/aide/aide.db.new.gz
MD5 : bJRt0P9rQ3lR7Wq4SZJlsw==
SHA1 : /nM1abzKvpoUSt22HiuKAsx7zE4=
RMD160 : Fw7M3O5xq55CKfXXuJgeQ9bn8aE=
TIGER : cJJxmyGjwuecrEIUNhJgsrRApqQmHNv6
SHA256 : iUpCg8pVKy6a34FdCNurMUL04BtV65sD
8k9pgX1mSr0=
SHA512 : /+DHSwBp2kcMHvO5HXk3FQvLbvZUO1xj
6+YDcT4kXyUcAekf46zoEKdDVd89AX8S
H3Xh7CRxF2uQ4wFTrFv8Gg==
End timestamp: 2025-01-16 12:55:16 +0300 (run time: 0m 42s)
При запуске с ключом --init
утилита aide
создаёт новую базу данных в файле
/var/lib/aide/aide.db.new.gz
, заданном директивой database_out
в
конфигурационном файле. Но для проверки целостности системы используется база
из файла /var/lib/aide/aide.db.gz
, путь к которому задан директивой
database
. Соответственно, для использования созданной базы данных необходимо
переименовать файл:
$ sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
9.2.2. Проверка целостности системы с помощью aide
Команда aide --check
выполняет проверку целостности системы и генерирует
соответствующий отчёт:
$ aide --check
Start timestamp: 2025-01-17 00:16:58 +0300 (AIDE 0.16)
AIDE found differences between database and filesystem!!
Summary:
Total number of entries: 204420
Added entries: 1
Removed entries: 0
Changed entries: 2
---------------------------------------------------
Added entries:
---------------------------------------------------
d++++++++++++++++: /root/.config/procps
---------------------------------------------------
Changed entries:
---------------------------------------------------
f ... .C... : /etc/cups/subscriptions.conf
f ... .C... : /etc/cups/subscriptions.conf.O
---------------------------------------------------
Detailed information about changes:
---------------------------------------------------
File: /etc/cups/subscriptions.conf
SHA512 : iY//ZXGfIOCw5w+dsglTJ5uanAu6ycGo | gw0CO7RN6yjIbRHvTVjthdZyfI/igk7K
SU5HoonBNSbGDb2sNVZLX/olLvPHyPDo | ZGoICuAK4CEZHcoTQTMPo0RSNRUqWXz0
qGGLZHHx35ce7yFxVxmjdQ== | el6dW9hvpSltkjJxywX3RQ==
File: /etc/cups/subscriptions.conf.O
SHA512 : HwYU5Ddhxs+MTd+7h67ToWOc1njts3eu | MZOiOFpYIbRYnZECCA+Dq9UZCoBlTO/n
Lro+IZrhTR+yVA0W85Ji0cKP/77ZdqFS | 0ELsf8rnHmL/pp6uz2GgJHURnrHclo0h
7FRt4bCEB1L1T8SNe8Nonw== | l4JpCwIjfXhWANs3mkkzzg==
---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------
/var/lib/aide/aide.db.gz
MD5 : bJRt0P9rQ3lR7Wq4SZJlsw==
SHA1 : /nM1abzKvpoUSt22HiuKAsx7zE4=
RMD160 : Fw7M3O5xq55CKfXXuJgeQ9bn8aE=
TIGER : cJJxmyGjwuecrEIUNhJgsrRApqQmHNv6
SHA256 : iUpCg8pVKy6a34FdCNurMUL04BtV65sD
8k9pgX1mSr0=
SHA512 : /+DHSwBp2kcMHvO5HXk3FQvLbvZUO1xj
6+YDcT4kXyUcAekf46zoEKdDVd89AX8S
H3Xh7CRxF2uQ4wFTrFv8Gg==
End timestamp: 2025-01-17 00:17:18 +0300 (run time: 0m 20s)
В данном примере, в системе были обнаружены следующие изменения относительно эталонного состояния из базы данных:
был создан каталог
/root/.config/procps
;был изменён файл
/etc/cups/subscriptions.conf
;был изменён файл
/etc/cups/subscriptions.conf.O
.
9.2.3. Обновление базы данных aide
Для обновления базы данных aide
после внесения изменений в систему используйте
команду aide --update
:
$ sudo aide --update
Start timestamp: 2025-01-17 00:27:30 +0300 (AIDE 0.16)
AIDE found differences between database and filesystem!!
New AIDE database written to /var/lib/aide/aide.db.new.gz
Summary:
Total number of entries: 204420
Added entries: 1
Removed entries: 0
Changed entries: 2
---------------------------------------------------
Added entries:
---------------------------------------------------
d++++++++++++++++: /root/.config/procps
---------------------------------------------------
Changed entries:
---------------------------------------------------
f ... .C... : /etc/cups/subscriptions.conf
f ... .C... : /etc/cups/subscriptions.conf.O
---------------------------------------------------
Detailed information about changes:
---------------------------------------------------
File: /etc/cups/subscriptions.conf
SHA512 : iY//ZXGfIOCw5w+dsglTJ5uanAu6ycGo | gw0CO7RN6yjIbRHvTVjthdZyfI/igk7K
SU5HoonBNSbGDb2sNVZLX/olLvPHyPDo | ZGoICuAK4CEZHcoTQTMPo0RSNRUqWXz0
qGGLZHHx35ce7yFxVxmjdQ== | el6dW9hvpSltkjJxywX3RQ==
File: /etc/cups/subscriptions.conf.O
SHA512 : HwYU5Ddhxs+MTd+7h67ToWOc1njts3eu | MZOiOFpYIbRYnZECCA+Dq9UZCoBlTO/n
Lro+IZrhTR+yVA0W85Ji0cKP/77ZdqFS | 0ELsf8rnHmL/pp6uz2GgJHURnrHclo0h
7FRt4bCEB1L1T8SNe8Nonw== | l4JpCwIjfXhWANs3mkkzzg==
---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------
/var/lib/aide/aide.db.gz
MD5 : bJRt0P9rQ3lR7Wq4SZJlsw==
SHA1 : /nM1abzKvpoUSt22HiuKAsx7zE4=
RMD160 : Fw7M3O5xq55CKfXXuJgeQ9bn8aE=
TIGER : cJJxmyGjwuecrEIUNhJgsrRApqQmHNv6
SHA256 : iUpCg8pVKy6a34FdCNurMUL04BtV65sD
8k9pgX1mSr0=
SHA512 : /+DHSwBp2kcMHvO5HXk3FQvLbvZUO1xj
6+YDcT4kXyUcAekf46zoEKdDVd89AX8S
H3Xh7CRxF2uQ4wFTrFv8Gg==
/var/lib/aide/aide.db.new.gz
MD5 : 9XQcGyeUGCo4jQFqKNWCSw==
SHA1 : JT98QJxegb+XsjzCHB5sbaFpsoQ=
RMD160 : t8pAZIn/4MsB+YiYi7wr1uie4iY=
TIGER : oddP+JHtsDFFr+9GeCymlZ7meJV0K5uI
SHA256 : SB9BYNaOzq8f5QYMbkNzTZ78yMWyp0lF
UUbNH8Q04Ig=
SHA512 : WeutFJZKQQydQkBSGvsuyC/ASE54vOcP
NnrJlj7PjjMXINFpQvIhgQvE+LwtDFjq
Kj9/MeYhjHQchYHNwhmotw==
End timestamp: 2025-01-17 00:27:53 +0300 (run time: 0m 23s)
Как и в случае с aide --init
, данная команда создаст новый файл базы данных
/var/lib/aide/aide.db.new.gz
, а также сгенерирует отчёт об изменениях в
системе относительно предыдущего состояния базы данных.
Поскольку на данном этапе у вас есть и новое, и старое состояние базы данных,
вы всё ещё можете запустить aide --check
для старой базы данных и провести
сравнительный анализ отчётов в случае возникновения такой необходимости.
Также утилита aide
поддерживает сравнение новой версии базы данных со старой
— за это отвечает аргумент командной строки --compare
. Для этого вам
необходимо либо добавить в конфигурационный файл /etc/aide.conf
директиву
database_new
, указывающую на путь к файлу с новой базой данных:
database_new=file:@@{DBDIR}/aide.db.new.gz
Либо вы можете определить значение директивы с помощью аргументов командной
строки --before
или --after
при вызове aide --compare
:
$ aide --compare --after='database_new=file:@@{DBDIR}/aide.db.new.gz'
Start timestamp: 2025-01-17 11:19:47 +0300 (AIDE 0.16)
AIDE found differences between the two databases!!
Summary:
Total number of entries: 204420
Added entries: 1
Removed entries: 0
Changed entries: 2
---------------------------------------------------
Added entries:
---------------------------------------------------
d++++++++++++++++: /root/.config/procps
---------------------------------------------------
Changed entries:
---------------------------------------------------
f ... .C... : /etc/cups/subscriptions.conf
f ... .C... : /etc/cups/subscriptions.conf.O
---------------------------------------------------
Detailed information about changes:
---------------------------------------------------
File: /etc/cups/subscriptions.conf
SHA512 : iY//ZXGfIOCw5w+dsglTJ5uanAu6ycGo | gw0CO7RN6yjIbRHvTVjthdZyfI/igk7K
SU5HoonBNSbGDb2sNVZLX/olLvPHyPDo | ZGoICuAK4CEZHcoTQTMPo0RSNRUqWXz0
qGGLZHHx35ce7yFxVxmjdQ== | el6dW9hvpSltkjJxywX3RQ==
File: /etc/cups/subscriptions.conf.O
SHA512 : HwYU5Ddhxs+MTd+7h67ToWOc1njts3eu | MZOiOFpYIbRYnZECCA+Dq9UZCoBlTO/n
Lro+IZrhTR+yVA0W85Ji0cKP/77ZdqFS | 0ELsf8rnHmL/pp6uz2GgJHURnrHclo0h
7FRt4bCEB1L1T8SNe8Nonw== | l4JpCwIjfXhWANs3mkkzzg==
---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------
/var/lib/aide/aide.db.gz
MD5 : bJRt0P9rQ3lR7Wq4SZJlsw==
SHA1 : /nM1abzKvpoUSt22HiuKAsx7zE4=
RMD160 : Fw7M3O5xq55CKfXXuJgeQ9bn8aE=
TIGER : cJJxmyGjwuecrEIUNhJgsrRApqQmHNv6
SHA256 : iUpCg8pVKy6a34FdCNurMUL04BtV65sD
8k9pgX1mSr0=
SHA512 : /+DHSwBp2kcMHvO5HXk3FQvLbvZUO1xj
6+YDcT4kXyUcAekf46zoEKdDVd89AX8S
H3Xh7CRxF2uQ4wFTrFv8Gg==
/var/lib/aide/aide.db.new.gz
MD5 : 9XQcGyeUGCo4jQFqKNWCSw==
SHA1 : JT98QJxegb+XsjzCHB5sbaFpsoQ=
RMD160 : t8pAZIn/4MsB+YiYi7wr1uie4iY=
TIGER : oddP+JHtsDFFr+9GeCymlZ7meJV0K5uI
SHA256 : SB9BYNaOzq8f5QYMbkNzTZ78yMWyp0lF
UUbNH8Q04Ig=
SHA512 : WeutFJZKQQydQkBSGvsuyC/ASE54vOcP
NnrJlj7PjjMXINFpQvIhgQvE+LwtDFjq
Kj9/MeYhjHQchYHNwhmotw==
End timestamp: 2025-01-17 11:19:57 +0300 (run time: 0m 10s)
После обновления базы данных и завершения работы с отчётами переименуйте файл, чтобы утилита aide
начала использовать новую базу для последующих проверок:
$ sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
9.2.5. Оповещение о нарушении целостности объектов контроля
Для автоматической проверки целостности системы утилитой aide
с заданной
периодичностью можно использовать службу cron
или таймеры systemd
, а для
отправки уведомлений — локальный почтовый сервер или любое другое решение,
которое можно вызвать из сценария командной строки.
9.2.5.1. Сценарий для автоматического запуска aide
Ниже приведён пример сценария командной строки, который запускает утилиту
aide
и отправляет её отчёт электронным письмом, если код возврата был
ненулевым. Такой код возврата означает, что во время проверки были обнаружены
расхождения с базой данных или возникли ошибки.
#!/bin/bash
# e-mail адрес, на который необходимо отправить отчёт aide
ADMIN_EMAIL='admin@localhost'
# исходящий e-mail адрес
FROM_EMAIL='aide@localhost'
# путь к файлу отчёта утилиты aide, задаётся директивой report_url в
# конфигурационном файле
AIDE_LOG='/var/log/aide/aide.log'
# тема письма
SUBJECT='AIDE: integrity check failed'
# запустить aide и отправить файл отчёта если код возврата не равен 0
/sbin/aide --check &>/dev/null || /sbin/sendmail -i -t <<EOF
To: ${ADMIN_EMAIL}
From: ${FROM_EMAIL}
Subject: ${SUBJECT}
$(cat ${AIDE_LOG})
EOF
Сохраните сценарий в файл /usr/local/bin/aide-report.sh
, установите корректные
права доступа и сделайте его исполняемым:
$ sudo chown root:root /usr/local/bin/aide-report.sh
$ sudo chmod 755 /usr/local/bin/aide-report.sh
9.2.5.2. Настройка локального почтового сервера
В данном руководстве в качестве почтовой службы предлагается использовать
postfix
, для его установки и включения выполните следующие команды:
$ sudo dnf install -y postfix
$ sudo systemctl enable --now postfix
Для целей тестирования дополнительная конфигурация почтового сервиса не
требуется — достаточно чтобы он был запущен и пользователь, на имя которого
будет отправляться электронная почта, существовал в системе. Полученная почта
будет сохраняться в текстовый файл очереди /var/spool/mail/ИМЯ_ПОЛЬЗОВАТЕЛЯ
,
с которым может работать как почтовый клиент Evolution (тип сервера
«Стандартная для Unix очередь типа mbox»), так и любая программа для просмотра
текстовых файлов (less
, cat
и т.п.). Для получения информации о безопасной
настройке почтовой службы для реальных условий вам необходимо обратиться к
специализированному руководству.
9.2.5.3. Периодический запуск aide
Периодический запуск aide с помощью cron
Для периодического запуска утилиты aide
с помощью службы cron
добавьте
соответствующую запись в файл crontab
пользователя root
. Например, для
проверки целостности системы каждые три часа, запустите редактор crontab
командой crontab -e
, добавьте в конец файла следующую запись и сохраните
изменения:
0 */3 * * * /usr/local/bin/aide-report.sh
Периодический запуск aide с помощью таймера systemd
В качестве альтернативы службе cron
вы также можете использовать таймеры
systemd
для запуска периодических задач.
В первую очередь создайте сервисный файл
/etc/systemd/system/aide-report.service
следующего содержания:
[Unit]
Description=AIDE periodic scan
[Service]
Type=simple
# команда для запуска
ExecStart=/usr/local/bin/aide-report.sh
# запускать команду от имени пользователя root
User=root
Затем создайте файл /etc/systemd/system/aide-report.timer
с описанием
таймера:
[Unit]
Description=Run AIDE scan every 3 hours
[Timer]
# запускать таймер каждые 3 часа
OnUnitActiveSec=3h
# запустить таймер через 5 минут после загрузки системы
OnBootSec=5min
[Install]
WantedBy=timers.target
Установите правильные права доступа и владельца для созданных файлов:
$ sudo chown root:root /etc/systemd/system/aide-report.{service,timer}
$ sudo chmod 644 /etc/systemd/system/aide-report.{service,timer}
Обновите конфигурацию systemd
и запустите таймер:
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now aide-report.timer
Created symlink /etc/systemd/system/timers.target.wants/aide-report.timer → \
/etc/systemd/system/aide-report.timer.
После этого таймер активируется и проверка системы будет выполняться каждые три часа.
Статус таймера можно посмотреть с помощью следующей команды:
$ sudo systemctl status aide-report.timer
● aide-report.timer - Run AIDE scan every 3 hours
Loaded: loaded (/etc/systemd/system/aide-report.timer; \
enabled; preset: disabled)
Active: active (waiting) since Tue 2025-01-28 18:52:27 MSK; \
4min 41s ago
Until: Tue 2025-01-28 18:52:27 MSK; 4min 41s ago
Trigger: Tue 2025-01-28 21:52:27 MSK; 2h 55min left
Triggers: ● aide-report.service
Jan 28 18:52:27 msvsphere.localdomain systemd[1]: \
Started Run AIDE scan every 3 hours.
9.2.6. Опции командной строки утилиты aide
Аргумент |
Описание |
---|---|
|
Выполняет проверку системы на предмет нарушения целостности относительно состояния, зафиксированного в базе данных |
|
Инициализирует базу данных для хранения состояния системы. После инициализации вам потребуется переименовать файл чтобы команда |
|
Обновляет базу данных |
|
Сравнивает две базы данных |
|
Останавливает работу |
|
Задаёт путь к конфигурационному файлу |
|
Ограничить проверку и обновление БД только файлами и каталогами, соответствующими заданному регулярному выражению. Обратите внимание, что регулярное выражение совпадает только с началом строки. Пример запуска |
|
Позволяет задать конфигурационные параметры, которые будут применены перед чтением конфигурационного файла. С полным списком доступных параметров вы можете ознакомиться на странице документации |
|
Позволяет задать конфигурационные параметры, которые будут применены после чтения конфигурационного файла. С полным списком доступных параметров вы можете ознакомиться на странице документации |
|
Определяет степень детальности вывода |
|
Указывает |
|
Вывести версию и параметры сборки |
|
Выдать справочную информацию об аргументах командой строки и завершить работу. |
9.3. Замкнутая программная среда (IMA/EVM)
В состав операционной системы МСВСфера входят компоненты IMA (Integrity Measurement Architecture) и EVM (Extended Verification Module), предназначенные для обеспечения целостности системы и защиты от несанкционированных изменений.
IMA — это подсистема ядра Linux, которая контролирует целостность файлов в системе:
при обращении к файлам вычисляет их хеш-суммы с помощью функции криптографического хеширования. Используемые ключи хранятся в подсистеме связки ключей ядра Linux;
сохраняет вычисленные хеш-суммы в расширенных атрибутах файловой системы;
обеспечивает проверку текущего содержимого файлов на соответствие ранее сохранённым эталонным значениям. Запрещает выполнение каких-либо операций с файлом если текущее значение хеш-суммы не совпадает с ожидаемым;
сохраняет результаты проверок в системный журнал для их последующего анализа.
EVM — это расширение IMA, которое контролирует целостность метаданных файлов в системе:
подписывает метаданные файлов (хеш-суммы IMA, атрибуты SELinux, права доступа, информацию о владельце/группе и т.п.) с помощью функции криптографического хеширования. Используемые ключи хранятся в подсистеме связки ключей ядра Linux;
проверяет подлинность метаданных файлов чтобы предотвратить их несанкционированное изменение.
Вместе технологии IMA и EVM обеспечивают комплексную систему защиты, которая
помогает предотвратить запуск или использование изменённых или поддельных
файлов. Система контроля целостности активируется на раннем этапе загрузки
операционной системы, непосредственно после монтирования корневой файловой
системы и перед запуском systemd
, и остаётся активной пока компьютер не будет
выключен.
9.3.1. Настройка подсистемы EVM
9.3.1.1. Создание ключей
Подсистема EVM использует симметричные ключи переменной длины для подписи и верификации расширенных атрибутов файлов.
Поддерживаются два типа ключей:
доверенные (trusted) — ключи, которые создаются и шифруются с использованием аппаратного модуля TPM (Trusted Platform Module), что обеспечивает дополнительный уровень безопасности;
программные — ключи, которые создаются с использованием программного генератора случайных чисел ядра Linux, наличие модуля TPM при этом не требуется. Такие ключи считаются менее защищёнными, но при этом обеспечивают лучшую производительность, что может быть иметь значение для высоконагруженных систем.
Необходимо решить, какой тип ключей будет использоваться в вашей системе и следовать инструкциям, предложенным в соответствующем разделе данного руководства.
Для генерации ключей и последующей настройки подсистемы IMA/EVM установите следующие пакеты:
$ dnf install attr keyutils ima-evm-utils
Предупреждение
Все команды, перечисленные в данном разделе, необходимо выполнять от имени пользователя root в рамках одной сессии поскольку в процессе работы ключи хранятся только в хранилище пользовательских ключей текущей сессии.
Создание доверенных ключей (TPM)
Предварительные требования
Операционная система МСВСфера 9 поддерживает работу только с модулями TPM версии 2.0. Проверить версию модуля можно следующим образом:
$ cat /sys/class/tpm/tpm0/tpm_version_major
2
Модули TPM 1.2 не поддерживаются.
Вам также потребуется установить пакет tpm2-tools
, предоставляющий утилиты
для работы с TPM модулем:
$ dnf install tpm2-tools
Создание корневого ключа хранилища TPM
Для создания ключей подсистемы EVM с помощью модуля TPM в первую очередь необходимо создать корневой ключ хранилища TPM (Storage Root Key, SRK):
$ tpm2_createprimary --hierarchy=o --key-algorithm=rsa2048 \
--hash-algorithm=sha256 --key-context=srk-key.ctxt
name-alg:
value: sha256
raw: 0xb
attributes:
value: fixedtpm|fixedparent|sensitivedataorigin|userwithauth| \
restricted|decrypt
raw: 0x30072
type:
value: rsa
raw: 0x1
exponent: 65537
bits: 2048
scheme:
value: null
raw: 0x10
scheme-halg:
value: (null)
raw: 0x0
sym-alg:
value: aes
raw: 0x6
sym-mode:
value: cfb
raw: 0x43
sym-keybits: 128
rsa: a7d3ff17a593a18fb3c0e85184dc2cec3ae322cb4df59a \
553ac8457fc675a942b1e79c16e25fcefeb707078364abfd5061cf29edc51396 \
68dd938546322f76d5faff726d64783ef500f088810e3e4b55d7d479bcc371097 \
1a698ae101ab6c18d0635cf2beea81d07c18f80c87a68f483a2 \
2ca8751291f5b87f7681f44143237baaab6df6f9f3563c3a0ccd30e172a11b3ed \
c9e1f234ac7c5574db10b9b4c16422d82e9875e526ebe22b36e \
3dff941b48d324913829903dd9dc87f8d37fd9381dfb24a425c2e2ec1befc2606d \
3724a71adae6815ecdbe69eacdba50e3e9c3d8562b170b45525 \
2929edbf518826887add46c86e28dd30d3229f1c7d2249b3f9a2d
Где аргументы имеют следующий смысл (см. подробности в
man 1 tpm2_createprimary
):
--hierarchy=o
— иерархия платформы TPM, в которой необходимо создать ключ,o
— этоTPM_RH_OWNER
;--key-algorithm=rsa2048
— использовать алгоритм RSA2048 для генерации ключа;--hash-algorithm=sha256
— использовать SHA256 в качестве алгоритма хеширования;--key-context=srk-key.ctxt
— файл, куда следует сохранить контекст объекта TPM (условно, это некая ссылка/ключ поиска объекта в TPM).
Для всех вышеприведённых аргументов кроме --key-context
были указаны их
значения по умолчанию, соответственно, при реальном использовании их можно
опустить.
Далее, необходимо сделать ключ хранилища персистентным — записать его в постоянный дескриптор (persistent handle):
$ tpm2_evictcontrol -c srk-key.ctxt 0x81000001
persistent-handle: 0x81000001
action: persisted
В данном примере используется дескриптор 0x81000001
, что является общепринятой
практикой, но доступные постоянные дескрипторы могут отличаться у разных TPM-модулей. Посмотреть их список можно следующим образом:
$ tpm2_getcap handles-persistent
- 0x81000001
- 0x81000002
- 0x81010001
- 0x81800000
- 0x81800001
Однако при использовании эмулируемых TPM-устройств, например, в виртуальных машинах, это не всегда работает.
Создание доверенного ключа EVM
Следующим этапом является генерация доверенного (trusted) ключа, с помощью которого затем будет создан защищённый ключ для EVM:
$ keyctl add trusted kmk-trusted "new 32 keyhandle=0x81000001" @u
534881893
в результате будет сгенерирован 256-битный (32 байта) доверенный ключ
kmk-trusted
в пользовательской связке ключей ядра (@u
). Обратите внимание на
аргумент keyhandle=0x81000001
— его значение должно совпадать с дескриптором,
в который был записан корневой ключ хранилища в на предыдущем этапе. Команда
keyctl add
возвращает серийный номер созданного ключа, в данном примере —
534881893
.
Теперь необходимо экспортировать доверенный ключ в файл чтобы сделать возможной его загрузку после перезагрузки системы:
# связать ключи ядра пользовательского пространства (@u) с пространством
# сессии (@s) чтобы команда keyctl pipe могла его экспортировать
$ keyctl link @u @s
# экспортировать доверенный ключ в файл /etc/keys/kmk-trusted.blob
$ keyctl pipe "$(keyctl search @u trusted kmk-trusted)" > /etc/keys/kmk-trusted.blob
# разрешить чтение и изменение файла только владельцу, в данном случае -
# пользователю root
$ chmod 600 /etc/keys/kmk-trusted.blob
Создание защищённого ключа EVM
Защищённый ключ подсистемы EVM используется для подписывания метаданных файлов. Он генерируется с помощью доверенного ключа следующей командой:
$ keyctl add encrypted evm-key "new trusted:kmk-trusted 32" @u
695962815
В данном примере 695962815
— это серийный номер созданного ключа.
Экспортируйте созданный ключ в файл /etc/keys/evm-trusted.blob
чтобы его
можно было загружать в ядро после перезагрузки системы:
$ keyctl pipe "$(keyctl search @u encrypted evm-key)" > /etc/keys/evm-trusted.blob
$ chmod 600 /etc/keys/evm-trusted.blob
Автоматическая загрузка доверенного ключа EVM (TPM)
Ядро операционной системы работает с ключами, которые находятся в памяти. Соответственно, после перезагрузки компьютера эти ключи необходимо загружать обратно в память ядра.
Вручную доверенный ключ EVM можно загрузить следующей командой:
$ keyctl add trusted kmk-trusted "load `cat /etc/keys/kmk-trusted.blob`" @u
559687686
Однако имеет смысл автоматизировать процесс с помощью dracut-модуля
masterkey
. Для этого создайте конфигурационный файл /etc/sysconfig/masterkey
следующего содержания:
MULTIKERNELMODE="NO"
MASTERKEYTYPE="trusted"
MASTERKEY="/etc/keys/kmk-trusted.blob"
И добавьте модуль masterkey
в initramfs:
$ echo 'add_dracutmodules+=" masterkey "' > /etc/dracut.conf.d/97-masterkey.conf
$ dracut --regenerate-all --force --verbose
...
dracut: *** Including module: masterkey ***
...
dracut: *** Creating image file '/boot/initramfs-6.1.123-4.lvc12.el9.inferit.x86_64.img' ***
dracut: dracut: using auto-determined compression method 'pigz'
dracut: *** Creating initramfs image file '/boot/initramfs-6.1.123-4.lvc12.el9.inferit.x86_64.img' done ***
Создание программных ключей EVM
Программные ключи являются полностью программной альтернативой доверенным ключам — для их создания и использования не требуется наличие TPM модуля. Такие ключи считаются менее безопасными, но при этом они обеспечивают лучшую производительность по сравнению с ключами, использующими TPM-модуль.
Создание корневого (KMK) ключа
В первую очередь необходимо создать KMK (Kernel Master Key) — корневой ключ, с помощью которого затем будет сгенерирован защищённый ключ для подсистемы EVM.
Для генерации ключа выполните следующую команду:
$ keyctl add user kmk-user "$(dd if=/dev/urandom bs=1 count=32 2> /dev/null)" @u
26358515
в результате будет сгенерирован 256-битный ключ (32 байта) kmk
в
пользовательской связке ключей ядра (@u
). Команда keyctl add
возвращает
серийный номер созданного ключа, в данном примере — 26358515
.
Теперь необходимо экспортировать доверенный ключ в файл чтобы сделать возможной его загрузку после перезагрузки системы:
# связать ключи ядра пользовательского пространства (@u) с пространством
# сессии (@s) чтобы команда keyctl pipe могла его экспортировать
$ keyctl link @u @s
# экспортировать ключ в файл /etc/keys/kmk-user.blob
$ keyctl pipe "$(keyctl search @u user kmk-user)" > /etc/keys/kmk-user.blob
# разрешить чтение и изменение файла только владельцу, в данном случае —
# пользователю root
$ chmod 600 /etc/keys/kmk-user.blob
Создание защищённого ключа EVM
Защищённый ключ подсистемы EVM используется для подписывания метаданных файлов. Он генерируется с помощью корневого (KMK) ключа следующей командой:
$ keyctl add encrypted evm-key "new user:kmk-user 64" @u
441992374
в результате будет создан 512-битный (64 байта) ключ evm-key
в
пользовательской связке ключей ядра (@u
), выводом команды является серийный
номер этого ключа.
Далее необходимо экспортировать созданный ключ в файл для загрузки в память ядра после перезагрузки системы и установить корректные права доступа:
$ keyctl pipe "$(keyctl search @u encrypted evm-key)" > /etc/keys/evm-trusted.blob
$ chmod 600 /etc/keys/evm-trusted.blob
Автоматическая загрузка корневого (KMK) ключа
Ядро операционной системы работает с ключами, которые находятся в памяти. Соответственно, после перезагрузки компьютера эти ключи необходимо загружать обратно в память ядра.
Вручную корневой (KMK) ключ можно загрузить следующей командой:
$ keyctl add user kmk "$(cat /etc/keys/kmk-user.blob)" @u
456548873
Однако имеет смысл автоматизировать процесс с помощью dracut модуля
masterkey
. Для этого создайте конфигурационный файл /etc/sysconfig/masterkey
следующего содержания:
MULTIKERNELMODE="NO"
MASTERKEYTYPE="user"
MASTERKEY="/etc/keys/kmk-user.blob"
И добавьте модуль masterkey
в initramfs:
$ echo 'add_dracutmodules+=" masterkey "' > /etc/dracut.conf.d/97-masterkey.conf
$ dracut --regenerate-all --force --verbose
...
dracut: *** Including module: masterkey ***
...
dracut: *** Creating image file '/boot/initramfs-6.1.123-4.lvc12.el9.inferit.x86_64.img' ***
dracut: dracut: using auto-determined compression method 'pigz'
dracut: *** Creating initramfs image file \
'/boot/initramfs-6.1.123-4.lvc12.el9.inferit.x86_64.img' done ***
Автоматическая загрузка защищённого ключа EVM
Как и в случае с доверенным ключом, защищённый ключ EVM можно загружать в память ядра вручную:
$ keyctl link @u @s
$ keyctl add encrypted evm-key "load $(cat /etc/keys/evm-trusted.blob)" @u
560076073
Однако для автоматического включения подсистемы EVM во время загрузки системы
требуется настроить автоматическую загрузку защищённого ключа. Для этого
служит dracut-модуль integrity
.
Необходимо создать конфигурационный файл /etc/sysconfig/evm
следующего
содержания:
EVMKEY="/etc/keys/evm-trusted.blob"
И добавить модуль integrity
в initramfs:
$ echo 'add_dracutmodules+=" integrity "' > /etc/dracut.conf.d/98-integrity.conf
$ dracut --regenerate-all --force --verbose
...
dracut: *** Including module: integrity ***
...
dracut: *** Creating image file '/boot/initramfs-6.1.123-4.lvc12.el9.inferit.x86_64.img' ***
dracut: dracut: using auto-determined compression method 'pigz'
dracut: *** Creating initramfs image file \
'/boot/initramfs-6.1.123-4.lvc12.el9.inferit.x86_64.img' done ***
9.3.2. Настройка подсистемы IMA
9.3.2.1. Выпуск ЭЦП для подсистемы IMA
Для построения замкнутой программной среды (ЗПС) вам потребуется электронно-цифровая подпись (ЭЦП), выпущенная на вашу организацию и заверенная производителем операционной системы МСВСфера.
Создайте конфигурационный файл ima-sign.conf
следующего содержания:
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = sign_extensions
[req_distinguished_name]
# название сертификата вашей организации
CN = IMA test signing key
# название вашей организации
O = IMA test
# контактный e-mail адрес вашей организации
emailAddress = ima-test@example.com
[sign_extensions]
basicConstraints=critical, CA:false
keyUsage=critical, digitalSignature
extendedKeyUsage = critical, codeSigning
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
Скорректируйте значения полей CN
(Common Name), O
(Organization) и
emailAddress
чтобы они соответствовали вашей организации.
Выполните следующую команду для генерации приватного ключа и запроса на выпуск сертификата ЭЦП:
$ openssl req -new -batch -config ima-sign.conf -out ima-sign.csr \
-keyout ima-sign.key
В процессе выполнения команды потребуется ввести пароль для создаваемого приватного
ключа. Для генерации ключа без пароля необходимо добавить аргумент -nodes
, но
это ухудшает безопасность и не рекомендуется для промышленного использования —
в случае утечки приватного ключа злоумышленник сразу сможет им воспользоваться.
В результате выполнения команды в текущем каталоге будут созданы следующие файлы:
ima-sign.key
— приватный ключ будущего сертификата;ima-sign.csr
— CSR-запрос (Certificate Signing Request) на выпуск сертификата.
Поместите файл ima-sign.key
в безопасное место, недоступное другим
пользователям, допустим, в каталог /root/ima
.
Просмотреть информацию, которая содержится в запросе на выпуск сертификата, можно с помощью команды:
$ openssl req -text -noout -verify -in ima-sign.csr
Далее, вам необходимо отправить файл ima-sign.csr
производителю ОС МСВСфера
для выпуска публичного сертификата. Производитель вернёт вам файл ima-sign.der
с заверенным публичным сертификатом, данный файл необходимо поместить в каталог
/etc/keys/ima
и установить для него безопасные права доступа:
$ mkdir -p /etc/keys/ima
$ mv ima-sign.der /etc/keys/ima/
$ chown root:root /etc/keys/ima/ima-sign.der
$ chmod 644 /etc/keys/ima/ima-sign.der
Просмотреть информацию, которая содержится в публичном сертификате, можно с помощью команды:
$ openssl x509 -noout -text -in /etc/keys/ima/ima-sign.der
9.3.2.2. Запуск IMA/EVM в режиме первичной настройки
Для продолжения настройки необходимо перезагрузить систему в режим первичной настройки IMA/EVM:
$ grubby --update-kernel=/boot/vmlinuz-$(uname -r) \
--args="ima_policy=appraise_tcb ima_appraise=fix evm=fix"
$ reboot
После перезагрузки необходимо убедиться, что подсистема IMA/EVM корректно инициализирована и готова к настройке:
$ cat /sys/kernel/security/evm
1
1
— подсистема EVM включена, 0
— выключена.
$ dmesg | grep 'evm: key'
[ 2.815612] evm: key initialized
Ключ для подсистемы EVM был успешно загружен.
9.3.2.3. Настройка замкнутой программной среды
Создайте каталог для хранения политик IMA:
$ mkdir /etc/ima
И файл политики IMA /etc/ima/ima-policy
, в качестве стартовой точки можно
использовать следующий набор правил:
# игнорировать файловую систему procfs: /proc
dont_appraise fsmagic=0x9fa0
# игнорировать файловую систему sysfs: /sys
dont_appraise fsmagic=0x62656572
# игнорировать файловую систему debugfs: /sys/kernel/debug
dont_appraise fsmagic=0x64626720
# игнорировать файловую систему tmpfs
dont_appraise fsmagic=0x1021994
# игнорировать файловую систему ramfs
dont_appraise fsmagic=0x858458f6
# игнорировать файловую систему devpts: /dev/pts
dont_appraise fsmagic=0x1cd1
# игнорировать файловую систему binfmt: /proc/sys/fs/binfmt_misc
dont_appraise fsmagic=0x42494e4d
# игнорировать файловую систему securityfs: /sys/kernel/security
dont_appraise fsmagic=0x73636673
# игнорировать файловую систему selinuxfs: /sys/fs/selinux
dont_appraise fsmagic=0xf97cff8c
# игнорировать файловую систему smackfs: /sys/fs/smackfs
dont_appraise fsmagic=0x43415d53
# игнорировать файловую систему nsfs: /proc/*/ns/*
dont_appraise fsmagic=0x6e736673
# игнорировать файловую систему efivarfs: /sys/firmware/efi/efivars
dont_appraise fsmagic=0xde5e81e4
# игнорировать файловую систему cgroup: /sys/fs/cgroup
dont_appraise fsmagic=0x27e0eb
# игнорировать файловую систему cgroup2: /sys/fs/cgroup
dont_appraise fsmagic=0x63677270
# игнорировать файловую систему FAT32
dont_appraise fsmagic=0x4d44
# не выполнять проверку файлов с меткой SELinux var_log_t. Этим типом
# маркируются файлы системных журналов, которые постоянно изменяются.
# Соответственно, проверка их ЭЦП не имеет смысла.
dont_measure obj_type=var_log_t
dont_appraise obj_type=var_log_t
# не выполнять проверку файлов с меткой SELinux audit_log_t - это файлы
# системного журнала событий безопасности службы auditd, которые так же
# постоянно изменяются.
dont_measure obj_type=auditd_log_t
dont_appraise obj_type=auditd_log_t
# не выполнять проверку файлов с меткой SELinux (s)virt_image_t - это файлы
# образов виртуальных машин, которые так же постоянно изменяются
dont_measure obj_type=svirt_image_t
dont_appraise obj_type=svirt_image_t
dont_measure obj_type=virt_image_t
dont_appraise obj_type=virt_image_t
# проверять ЭЦП для файлов с политиками IMA
appraise func=POLICY_CHECK appraise_type=imasig
# проверять ЭЦП запускаемых файлов
appraise func=BPRM_CHECK appraise_type=imasig
# проверять ЭЦП для отображаемых в память файлов (системный вызов mmap)
appraise func=FILE_MMAP mask=MAY_EXEC appraise_type=imasig
# проверять ЭЦП для загружаемых ядром прошивок
appraise func=FIRMWARE_CHECK appraise_type=imasig
# проверять IMA хеши (но не ЭЦП) для всех файлов, которыми владеет root
appraise fowner=0
Установите для файла политик корректные права доступа:
$ chmod 600 /etc/ima/ima-policy
$ chown root:root /etc/ima/ima-policy
$ restorecon /etc/ima/ima-policy
И подпишите его вашей ЭЦП, заверенной производителем ОС:
$ evmctl ima_sign --key=/root/ima/ima-sign.key /etc/ima/ima-policy
hash(sha256): ca9fe00713e1280f2162fd3a2af7c8296f3a5aa7e9136150df10ad7414656622
Enter PEM pass phrase:
evm/ima signature: 264 bytes
0302042a5b2625010063d3f76227571772377b52a4bb8d0c6d9b1ee26a2cee2aa0 \
1ffa2507599e1926f08d71c261eb48ebdd26e5d2420b7701a164ab1c5f61524147c \
254f0737d8425120d3df40a9cfbc3094fefbcd91f3bf3eeb8b6785665212ffb8539 \
166a0071552ce476af57b6e97d4fc96bd00ad3cf01d6a5c254127e9a7b443b85198 \
2b9137e50383524df6e6e8715ea585251dcd721c5877a632dc6e2aaca4010fdb80 \
c9d1299f4b1ebf8e2a073647919f1d3cb0f2040b2033b4effd9ccbfd010978a748 \
c1ce9d5c9af71d9f1e8d89f94f4634dd44770c95a8996157dadab3bf2ac5144c3d \
7a9c4bf8bc7c3f20b0db1c855c9b017b5f7a5e1bbc24cb9b02ef4e3664d68a1a7
Задайте корректный путь к файлу привтного ключа вашей ЭЦП, в данном примере
используется /root/ima/ima-sign.key
. При следующей загрузке системы политика
IMA будет автоматически загружена в ядро подсистемой systemd
.
Далее необходимо будет подписать вашей ЭЦП все файлы, заданные политикой IMA.
Следующая команда подпишет все исполняемые файлы, владельцем которых является
пользователь root
:
$ /usr/bin/find / \( -fstype ext4 -o -fstype xfs \) -type f -executable -uid 0 \
-exec evmctl --hashalgo=sha256 ima_sign --pass=PASSWORD \
--key=/root/ima/ima-sign.key '{}' \;
Здесь и в последующих листингах замените PASSWORD
на пароль от приватного
ключа вашей ЭЦП IMA.
Для подписи разделяемых библиотек выполните:
$ /usr/bin/find /lib /lib64 /usr/lib /usr/lib64 /usr/libexec/ \
\( -fstype ext4 -o -fstype xfs \) -\! -executable -type f -name "*.so*" \
-uid 0 -exec evmctl --hashalgo=sha256 \
ima_sign --pass=PASSWORD --key=/root/ima/ima-sign.key '{}' \;
Следующая команда подпишет модули ядра:
$ /usr/bin/find /lib/modules \( -fstype ext4 -o -fstype xfs \) \
-type f -name "*.ko" -uid 0 -exec evmctl --hashalgo=sha256 \
ima_sign --pass=PASSWORD --key=/root/ima/ima-sign.key '{}' \;
Для подписи прошивок драйверов выполните:
$ /usr/bin/find /lib/firmware \( -fstype ext4 -o -fstype xfs \) \
-type f -uid 0 -exec evmctl --hashalgo=sha256 \
ima_sign --pass=PASSWORD --key=/root/ima/ima-sign.key '{}' \;
Для завершения настройки подсистемы IMA необходимо обновить хеш-суммы всех файлов для подсистемы EVM:
$ find / \( -fstype ext4 -o -fstype xfs \) -type f -uid 0 \
-exec dd if='{}' of=/dev/null count=0 status=none \;
Выполнение последней команды может занять достаточно продолжительное время (несколько минут), поскольку выполняется маркировка всех файлов в системе.
Теперь необходимо перевести систему в основной режим работы IMA/EVM и перезагрузить компьютер:
$ grubby --update-kernel=/boot/vmlinuz-$(uname -r) \
--args="ima_policy=appraise_tcb ima_appraise=enforce" \
--remove-args="evm=fix"
$ reboot
9.3.3. События безопасности IMA/EVM
В случае обнаружения нарушения целостности отслеживаемых файлов подсистема
IMA/EVM создаёт в журнале службы аудита /var/log/audit/audit.log
запись об
инциденте с типом INTEGRITY_DATA
.
В качестве эксперимента создайте копию исполняемого файла /usr/bin/cp
:
$ sudo cp /usr/bin/cp /root
И попробуйте его запустить:
$ sudo /root/cp --version
-bash: /root/cp: Отказано в доступе
В это время системном журнале событий безопасности появится следующая запись:
$ sudo ausearch -m INTEGRITY_DATA -ts recent
----
time->Wed Feb 5 19:38:49 2025
type=PROCTITLE msg=audit(1738773529.602:286): proctitle="-bash"
type=SYSCALL msg=audit(1738773529.602:286): arch=c000003e syscall=59 \
success=no exit=-13 a0=55996be5ce10 a1=55996bd40c00 a2=55996be4b570 \
a3=8 items=0 ppid=2680 pid=2776 auid=1000 uid=0 gid=0 euid=0 suid=0 \
fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=1 comm="bash" exe="/usr/bin/bash" \
subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)
type=INTEGRITY_DATA msg=audit(1738773529.602:286): pid=2776 uid=0 \
auid=1000 ses=1 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 \
op=appraise_data cause=IMA-signature-required comm="bash" \
name="/root/cp" dev="dm-0" ino=67975531 res=0 errno=0
При этом исходный файл, подписанный вашей ЭЦП, может быть запущен без проблем:
$ /usr/bin/cp --version
cp (GNU coreutils) 8.32
9.3.4. Рекомендации по отладке и диагностике IMA/EVM
Основные сообщения об ошибках IMA/EVM появляются в dmesg
по ключам ima
,
evm
или dract-pre-pivot
, для их просмотра можно использовать следующую команду:
$ dmesg | grep -i -e evm -e ima -e dracut-pre
[ 0.000000] Command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-6.1.123-4.lvc12.el9.inferit.1.x86_64 \
root=/dev/mapper/mvg-root ro resume=/dev/mapper/mvg-swap rd.lvm.lv=mvg/root \
rd.lvm.lv=mvg/swap rhgb quiet ima_policy=appraise_tcb ima_appraise=enforce
[ 0.039996] mtrr_cleanup: can not find optimal value
[ 0.081870] Kernel command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-6.1.123-4.lvc12.el9.inferit.1.x86_64 \
root=/dev/mapper/mvg-root ro resume=/dev/mapper/mvg-swap rd.lvm.lv=mvg/root \
rd.lvm.lv=mvg/swap rhgb quiet ima_policy=appraise_tcb ima_appraise=enforce
[ 0.081943] Unknown kernel command line parameters \
"rhgb BOOT_IMAGE=(hd0,gpt2)/vmlinuz-6.1.123-4.lvc12.el9.inferit.1.x86_64", will be passed to user space.
[ 0.418423] Trying to unpack rootfs image as initramfs...
[ 1.003913] Loaded X.509 cert 'NCSD LLC: MSVSphere IMA CA: 77006f8de02bdc27ead8dbf4c1da12adbf6e05ec'
[ 1.014173] ima: Allocated hash algorithm: sha256
[ 1.024341] ima: No architecture policies found
[ 1.024368] evm: Initialising EVM extended attributes:
[ 1.024368] evm: security.selinux
[ 1.024369] evm: security.SMACK64 (disabled)
[ 1.024369] evm: security.SMACK64EXEC (disabled)
[ 1.024369] evm: security.SMACK64TRANSMUTE (disabled)
[ 1.024370] evm: security.SMACK64MMAP (disabled)
[ 1.024370] evm: security.apparmor (disabled)
[ 1.024370] evm: security.ima
[ 1.024371] evm: security.capability
[ 1.024371] evm: HMAC attrs: 0x1
[ 1.133410] Freeing unused kernel image (initmem) memory: 3116K
[ 1.133878] Freeing unused kernel image (text/rodata gap) memory: 2040K
[ 1.133948] Freeing unused kernel image (rodata/data gap) memory: 4K
[ 1.140578] BOOT_IMAGE=(hd0,gpt2)/vmlinuz-6.1.123-4.lvc12.el9.inferit.1.x86_64
[ 1.156567] systemd[1]: systemd 252-46.el9_5.2.inferit.1 running in system mode \
(+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL \
+ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK \
+PCRE2 -PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK \
+XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[ 1.156691] systemd[1]: Hostname set to <ima-test>.
[ 1.326797] device-mapper: core: CONFIG_IMA_DISABLE_HTABLE is disabled. \
Duplicate IMA measurements will not be recorded in the IMA log.
[ 2.077542] fbcon: vmwgfxdrmfb (fb0) is primary device
[ 2.605704] PM: Image not found (code -22)
[ 2.890032] evm: key initialized
[ 3.376525] systemd[1]: Successfully loaded the IMA custom policy /etc/ima/ima-policy.
[ 3.376527] ima: policy update completed
[ 3.437773] systemd[1]: systemd 252-46.el9_5.2.inferit.1 running in system mode \
(+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL \
+ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK \
+PCRE2 -PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK \
+XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[ 3.719750] systemd[1]: TPM2 PCR Machine ID Measurement was skipped because of an \
unmet condition check \
(ConditionPathExists=/sys/firmware/efi/efivars/StubPcrKernelImage-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f).
Особое внимание следует обратить на следующие сообщения:
Kernel command line: ... ima_policy=appraise_tcb ima_appraise=enforce
— IMA/EVM запущены в основном режиме;evm: key initialized
— ключ EVM был успешно загружен в ядро;systemd[1]: Successfully loaded the IMA custom policy /etc/ima/ima-policy
иima: policy update completed
— политика IMA была успешно загружена в ядро.
Для просмотра расширенных атрибутов файла используйте команду getfattr
:
$ getfattr -d -m - /usr/bin/bash
getfattr: Removing leading '/' from absolute path names
# file: usr/bin/bash
security.evm=0sAmb9oe4fRqe+0QHweWVpFF6FJ6JM
security.ima=0sAwIEKlsmJQEAbpXlqB4Xg3QISGrJ \
FX4aJb2Y4LrMb2rvQlrOTQ+GgCM42+9cFnwYGyfOP8ua9 \
9R//ZukguXEgY1VWc5jdFyKmbfJHkmJRebYHa15Q9LGQ7lr \
9mfMxaNU8fU7VvdKHDhtPDA3mU2VbPamLI+eB210kT6MCGGs \
2bsou512HImpKE7jQR/X0nmOoOAJTeuinT9qeB2QKtuF2pth3H \
g03iU85xdAhFi+ZWHAKj2i3F4frI/pTXwQE1XrwS67ULpME4MRT \
LJWpyC4g8rZnBk50/2KK0QY4Rv6d2isIKA+OiccGu/jdKVxrGn \
5zI1f28gGeKw+Amx44rKnmR9eSRz25MtFog==
security.selinux="system_u:object_r:shell_exec_t:s0"
Для проверки IMA-подписи файла испольуется утилита evmctl
из состава пакета
ima-evm-utils
:
$ evmctl ima_verify --key=/etc/keys/ima/ima-sign.der /usr/bin/bash
key 1: 2a5b2625 /etc/keys/ima/ima-sign.der
/usr/bin/bash: verification is OK
В качестве значения аргумент --key
принимает путь к публичному сертификату
IMA-подписи.
Для просмотра публичных ключей IMA в связке ключей ядра используйте следующую команду:
$ keyctl show %keyring:.ima
Keyring
332912505 ---lswrv 0 0 keyring: .ima
1043633425 ---lswrv 0 0 \_ asymmetric: NCSD LLC: MSVSphere \
kernel signing key: d4353662476ed06d8c1d78c4dcf488fb698a44a1
279154357 --als--v 0 0 \_ asymmetric: NCSD LLC: MSVSphere 9 \
IMA release key: 90881827430f8032f8ab35acde286d3bb9f555e0
432155330 --als--v 0 0 \_ asymmetric: IMA test signing key: \
d1bea3d33a7fe2795470ac3dd046c45f2a5b2625
Первые два ключа принадлежат ЭЦП производителя операционной системы МСВСфера, а последний ключ должен совпадать с идентификатором вашего IMA-сертификата, который можно получить с помощью команды:
$ openssl x509 -noout -text -in /etc/keys/ima/ima-sign.der | grep -A1 "Subject Key Identifier"
X509v3 Subject Key Identifier:
D1:BE:A3:D3:3A:7F:E2:79:54:70:AC:3D:D0:46:C4:5F:2A:5B:26:25
Если ваша система не загружается по причине неверной конфигурации IMA/EVM, то
вы можете вручную добавить в список опций ядра параметры
evm=fix ima_appraise=fix
через меню загрузчика Grub — компьютер загрузится в
режим первичной настройки IMA/EVM и вы сможете устранить проблему.
9.4. Проверка контрольных сумм неизменяемых компонентов
Для выполнения проверки контрольных сумм неизменяемых компонентов
операционной системы МСВСфера 9 (ФСТЭК) вам необходимо
скачать утилиту fstec-checksum-validator.py
(https://docs.msvsphere-os.ru/_static/integrity-monitoring/fstec-checksum-validator.py) и
файл msvsphere-fstec-checksums.txt
с
контрольными суммами с официальной страницы Продукта (https://msvsphere-os.ru/downloads/).
Пометьте скачанный файл fstec-checksum-validator.py
как исполняемый:
$ chmod +x fstec-checksum-validator.py
Затем, запустите следующую команду для выполнения проверки:
$ sudo ./fstec-checksum-validator.py verify -c msvsphere-fstec-checksums.txt
Программа завершит работу с нулевым кодом возврата, если контрольные суммы всех неизменяемых компонентов соответствуют эталонным:
$ sudo ./fstec-checksum-validator.py verify -c msvsphere-fstec-checksums.txt
0 failed, 123531 passed
$ echo $?
0
В случае обнаружения несоответствий программа завершит работу с ненулевым кодом возврата и выведет на экран список файлов, контрольные суммы которых отличаются от эталонных:
$ sudo ./fstec-checksum-validator.py verify -c msvsphere-fstec-checksums.txt
/usr/libexec/git-core/git-http-backend checksum \
b8f115ad8618a6a37af4c02f6a4558c9f256ca3af4eb6bbfd59f55a0ae49d6ff does not match expected
/usr/libexec/git-core/git-http-fetch checksum \
b7d5446ef3c34a3d633260a5ef59f7ade0cd7ed3fe953e65c512b9026ef4ef41 does not match expected
/usr/libexec/git-core/git-http-push checksum \
93a9b24b51cdb92af75710dbd00c242c0894ef7fc6a19f319d72a0eaf0996dd2 does not match expected
/usr/libexec/git-core/git-imap-send checksum \
6e8e3c34822ccc824ba08154c7d1da3315d8f6f28bec413d7423c04e07932306 does not match expected
/usr/libexec/git-core/git-remote-http checksum \
95301168ea86f0ec01dd11aec1692e4a706d3ff39ada97a8888e18dadbee682c does not match expected
/usr/libexec/git-core/git-sh-i18n--envsubst checksum \
6fe4f71da651a23eb2721727c02fede3100c282f932eef885b71514e20f3861c does not match expected
6 failed, 123525 passed
$ echo $?
1