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

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

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

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

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

Обновлено: 16.03.2015