Русский перевод: Михаил Сгибнев
Содержание
- 18.1. Как это работает
- 18.2. Файл сигнатур
- 18.3. Генерирование контрольной суммы
- 18.4. Уровни доступа
- 18.5. Конфигурация ядра
Veriexec является системой проверки целостности файлов NetBSD.
Она входит в состав ядра, поэтому может обеспечить защиту даже
в случае компрометации учетной записи пользователя root.
Эта глава применима только к версии NetBSD 3.0 и выше.
18.1. Как это работает
Veriexec работает загружая файл спецификации, также
называемый также файлом сигнатур,
в ядро. Этот файл содержит информацию о файлах, мониторинг
которых проводится, в виде хэшей и различные флаги, которые
мы обсудим позже.
В настоящий момент поддерживаются следующие алгоритмы Veriexec:
MD5,
SHA1,
SHA256,
SHA384,
SHA512, and
RMD160.
18.2. Файл сигнатур
Запись в фале сигнатур выглядит следующим образом:
/path/to/file algorithm fingerprint flags
Где первое поле представляетс собой абсолютный путь до файла,
далее указан алгоритм и ASCII отпечаток (контрольная сумма).
18.3. Генерирование контрольной суммы
Вы можете сгенерировать контрольную сумму ASCII
для каждого алгоритма используя слкдующие утилиты:
Таблица 18.1. Veriexec fingerprints tools
Алгоритм Утилита MD5 /usr/bin/md5
SHA1 /usr/bin/sha1
SHA256 digest sha256
(из
pkgsrc)SHA384 digest sha384
(из
pkgsrc)SHA512 digest sha512
(из
pkgsrc)RMD160 /usr/bin/rmd160
Для примера, создадим контрольную сумму MD5 для
/bin/ls
:
%
md5 < /bin/ls
a8b525da46e758778564308ed9b1e493
Добавим контрольную сумму SHA512 для
/bin/ps
:
%
digest sha512 < /bin/ps
381d4ad64fd47800897446a2026eca42151e03adeae158db5a34d12c529559113d928a9fef9a7c4615d257688d1da4645db004081030d7f080bb7198067eb890
С каждой записью может ассоциироваться несколько флагов.
В настоящее время флаги описывают метод обращения к файлу, которому
соответствует запись. Обратите внимание, что этот тип доступа
применим только в 2 уровне доступа (режим IPS) и выше.
Типы доступа могут быть «DIRECT»,
«INDIRECT» и «FILE».
указывает на прямое выполнение и не вызывается как интерпретатор
для некоего сценария или открываемого текстовым редактором.
К большинству используемых вами файлов стоит обращаться именно
так:
%
ls /tmp
%
cp ~/foo /tmp/bar
%
rm ~/foo
означает косвенное выполнение файла, например, для интерпретации
сценария. Это происходит, когда сценарий в первой строке
содержит #!. Для примера, у нас усть скрипт, в первой строке
содержащий:
#!/bin/sh
И вы запускаете его:
%
./script.sh
В этом случае происходит косвенный вызов
/bin/sh
для интерпретации
скрипта.
указывает на невыполняемый (или, который не должен быть выполняемым)
файл. Это могут быть библиотеки, файлы конфигурации и т.д.
Вот несколько примеров записей в файле сигнатур Veriexec:
/bin/ls MD5 dc2e14dc84bdefff4bf9777958c1b20b DIRECT /usr/bin/perl MD5 914aa8aa47ebd79ccd7909a09ed61f81 INDIRECT /etc/pf.conf MD5 950e1dd6fcb3f27df1bf6accf7029f7d FILE
Veriexec позволят вам определить несколько вариантов доступа к файлу.
Для примера, /usr/bin/perl
может быть вызван
как интерпретатор, так и в качестве самостоятельной программы.
Для этого мы должны указать:
/usr/bin/perl MD5 914aa8aa47ebd79ccd7909a09ed61f81 DIRECT, INDIRECT
Сценарии оболочки, использующие #! для «выполнения»
также требуют указания двух типов доступа: «DIRECT» для
выполнения и «FILE» для того, чтобы ядро могло подать
содержимое скрипта интерпретатору:
/usr/src/build.sh MD5 e80dbb4c047ecc1d84053174c1e9264a DIRECT, FILE
Для облегчения создания фала сигнатур и повышения читабельности,
Veriexec может понимать следующие псевдонимы:
Таблица 18.2. Псевдонимы типов Veriexec
Alias Expansion PROGRAM DIRECT INTERPRETER INDIRECT SCRIPT DIRECT, FILE LIBRARY FILE
Примерный сценарий для генерации контрольных сумм доступен в
/usr/share/examples/veriexecctl
. После
генерации файла сигнатур, который сохраняется в
/etc/signatures
, а включение Veriexec
осучествляется через rc.conf
:
veriexec=YES
18.4. Уровни доступа
С тех пор, как люди заинтересовались использованием
Veriexec для различных целей, мы определили четыре уровня
доступа, называемые режимами «learning»,
«IDS», «IPS» и «lockdown».
На уровне доступа 0,
режиме learning, Veriexec будет действовать пассивно и только предупреждать
о любых аномалиях. При обьединении с уровнем 1, может оказаться
полезным при отладке файла сигнатур. На этом уровне, в отличие от
остальных, вы можете загружать новые записи в ядро.
На уровне доступа 1,
режиме IDS, будет запрещаться доступ к файлам с несоответствующей
контрольной суммой. Этот режим больше всего подходит пользователям,
которые предпочитают просто запретить доступ к файлам, которые
могут быть модифицированы злоумышленником.
Уровень доступа 2, режим IPS,
предпринимает шаги по защите файлов. В дополнение к предотвращению
доступа к файлам с несоответствующей контрольной суммой,
закроется доступ на запись и удаление защищаемых файлов и
будет организовано ведение журналов доступа к этим файлам.
Режим блокировки (уровень доступа 3)
может использоваться в критических ситуациях, например машин специального
назначения, или последней линии обороны после компрометации системы,
что-бы воспрепятствовать злоумышленнику удалить следы взлома.
будет запрещено создание новых файлов и запрещен доступ к файлам, не
контролируемых Veriexec.
Мы рекомендуем выполнить первый запуск Veriexec в режиме 0 и
отлаживать в режиме 1, для точной подстройки файла сигнатур,
удостовериться в правильной работе приложений и только после этого
повышать уровень. Для автоматической установки уровня доступа
после перезагрузки вы можете использовать
/etc/sysctl.conf
:
kern.veriexec.strict=1
18.5. Конфигурация ядра
Для использования Veriexec необходимо, кроме создания файла сигнатур,
обеспечить поддержку в файле конфигурации ядра: (например
/usr/src/sys/arch/i386/conf/GENERIC.local
):
options VERIFIED_EXEC
Затем, нам необходимо установить поддреживаемые алгоритмы
хэширования:
options VERIFIED_EXEC_FP_MD5 options VERIFIED_EXEC_FP_SHA1 options VERIFIED_EXEC_FP_RMD160 options VERIFIED_EXEC_FP_SHA512 options VERIFIED_EXEC_FP_SHA384 options VERIFIED_EXEC_FP_SHA256
В заключение добавим псевдо-устройство Veriexec:
pseudo-device veriexec 1
Далее, как обычно, компилируем, устанавливаем новое ядро и
перезагружаемя.