Глава 18. Подсистема Veriexec NetBSD

Русский перевод: Михаил Сгибнев

Содержание

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».

  • Метод DIRECT
    указывает на прямое выполнение и не вызывается как интерпретатор
    для некоего сценария или открываемого текстовым редактором.
    К большинству используемых вами файлов стоит обращаться именно
    так:

    	% ls /tmp
    	% cp ~/foo /tmp/bar
    	% rm ~/foo
  • Метод INDIRECT
    означает косвенное выполнение файла, например, для интерпретации
    сценария. Это происходит, когда сценарий в первой строке
    содержит #!. Для примера, у нас усть скрипт, в первой строке
    содержащий:

    	#!/bin/sh

    И вы запускаете его:

    	% ./script.sh

    В этом случае происходит косвенный вызов
    /bin/sh для интерпретации
    скрипта.

  • Запись FILE
    указывает на невыполняемый (или, который не должен быть выполняемым)
    файл. Это могут быть библиотеки, файлы конфигурации и т.д.

    Вот несколько примеров записей в файле сигнатур 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

    Далее, как обычно, компилируем, устанавливаем новое ядро и
    перезагружаемя.