Безопасность и оптимизация Linux.Редакция для Red Hat

       

Запуск ISC BIND/DNS в chroot окружении.


Эта часть фокусируется на предотвращении использования ISC BIND/DNS, как точки прерывания для доступа к системе. Так как ISC BIND/DNS выполняет относительно большую и комплексную функцию, вероятность возникновения ошибки, затрагивающей защиту, высока. Фактически, в прошлом имелись дефекты, которые позволяли удаленному пользователю получить root доступ к серверу с запущенным BIND.

Чтобы минимизировать риск, ISC BIND/DNS может быть запущен как не root пользователь, который сможет нанести повреждения, как нормальный пользователь с локальным shell. Конечно, этого не достаточно для обеспечения безопасности большинства DNS серверов, поэтому может быть предпринят дополнительный шаг – запуск ISC BIND в chroot заключении.

Основная выгода chroot состоит в том, что в результате ограничивается часть файловой системы, которую DNS демон может видеть, корневым каталогом “окружения”. Так как “окружение” создается только для поддержки DNS, число программ связанных с ISC BIND/DNS и доступных в этой части файловой системы чрезвычайно ограничено. Наиболее важно то, что здесь отпадает необходимость в setuid-root программах, которые могут быть использованы для получения root доступа и взлома “окружения”.

ЗАМЕЧАНИЕ: Исполняемая программа “named” должна располагаться в каталоге, описанном в переменной PATH. В этом документе, я буду считать, что путь к named будет “/usr/sbin/named”.

Для запуска ISC BIND/DNS в chroot “окружении” необходимо сделать слеующие шаги:

Шаг 1

Мы должны найти совместно-используемые библиотеки от которых зависит named (named – это DNS демон). Их будет нужно позже скопировать в chroot “окружение”.

Для поиска подобных библиотек используйте следующую команду:

[root@deep /]# ldd /usr/sbin/named

libc.so.6 => /lib/libc.so.6 (0x40017000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Сделайте себе соответствующую отметку, чтобы можно было использовать ее позже на следующих шагах.



Шаг 2

Сейчас мы должны определить chroot окружение и создавать корневой каталог для него. Мы выбрали каталог “/chroot/named”, потому что хотим разместить ее на независимом разделе, чтобы предотвратить атаки на файловую систему. Раньше, во время инсталляции Linux мы создали раздел “/chroot” специально предназначенный для этого.


[root@deep /]# /etc/rc.d/init.d/named stop ( требуется ввести только если сещуствующий named демон запущен)

Shutting down named: [ OK ]

[root@deep /]# mkdir -p /chroot/named

Затем, создаем остальные каталоги:

[root@deep /]# mkdir /chroot/named/dev

[root@deep /]# mkdir /chroot/named/lib

[root@deep /]# mkdir /chroot/named/etc

[root@deep /]# mkdir -p /chroot/named/usr/sbin

[root@deep /]# mkdir -p /chroot/named/var/run

[root@deep /]# mkdir /chroot/named/var/named

Сейчас копируем основные конфигурационные файлы, файлы с описаниями зон, программы named named-xfer в необходимые места:

[root@deep /]# cp /etc/named.conf /chroot/named/etc/

[root@deep /]# cd /var/named ; cp -a . /chroot/named/var/named/

[root@deep /]# mknod /chroot/named/dev/null c 1 3

[root@deep /]# chmod 666 /chroot/named/dev/null

[root@deep /]# cp /usr/sbin/named /chroot/named/usr/sbin/

[root@deep /]# cp /usr/sbin/named-xfer /chroot/named/usr/sbin/

ВАЖНОЕ ЗАМЕЧАНИЕ. Для подчиненного сервера имен владельцем каталога “/chroot/named/var/named” и всех файлов расположенных в нем должен быть процесс с “named”, иначе вы не сможете осуществить пересылку зоны. Чтобы сделать на подчиненном сервере владельцем каталога “named” и всех файлов лежащих в нем пользователя “named” используйте следующую команду:

[root@deep /]# chown -R named.named /chroot/named/var/named/

Шаг 3

Копируйте разделяемые библиотеки определенные на шаге 1 в chroot каталог lib:

[root@deep /]# cp /lib/libc.so.6 /chroot/named/lib/

[root@deep /]# cp /lib/ld-linux.so.2 /chroot/named/lib/

Шаг 4

Копируйте файлы “localtime” и “nsswitch.conf” в chroot каталог etc, чтобы элементы файлов регистрации были правильно установлены для вашей временной зоны:

[root@deep /]# cp /etc/localtime /chroot/named/etc/

[root@deep /]# cp /etc/nsswitch.conf /chroot/named/etc/

Шаг 5

Для большей безопасности на некоторые файлы из каталога “/chroot/named/etc” мы должны установить бит постоянства:

[root@deep /]# cd /chroot/named/etc/

[root@deep etc]# chattr +i nsswitch.conf



[root@deep /]# cd /chroot/named/etc/

[root@deep etc]# chattr +i named.conf

Файл с атрибутом “+i” не может быть модифицирован, удален или переименован; к нему не может быть создана ссылка и никакие данные не могут быть записаны в него. Только суперпользователь может установить или снять этот атрибут.

Шаг 6

Добавьте новый UID и новый GID для запуска демона “named”, если они еще не определены. Это важно, так как запуск его как root нарушит правильное функционирование “окружения”, а использование существующих пользовательских id позволит вашему сервису получить доступ к другим ресурсам.

Проверьте файлы “/etc/passwd” и “/etc/group” на наличие свободных UID/GID. В нашем примере, мы используем номер “53” и имя “named”.

[root@deep /]# useradd -c “DNS Server” -u 53 -s /bin/false -r -d /chroot/named named 2>/dev/null :

Шаг 7

Мы должны сказать syslogd (демону системы syslog) о новом chrooted сервисе: Обычно, процессы обращаются к syslogd через “/dev/log”. chroot-овое “окружение”, этого сделать не сможет, поэтому syslogd необходимо объяснить, что нужно слушать “/chroot/named/dev/log” вместо принятого по умолчанию “dev/log”. Чтобы сделать это, нужно редактировать скрипт запуска syslog.

Редактируйте скрипт syslog (vi +24 /etc/rc.d/init.d/syslog) и измените следующую строку:

daemon syslogd -m 0

Должна читаться как:

daemon syslogd -m 0 -a /chroot/named/dev/log

Шаг 8

Скрипт для запуска ISC BIND/DNS по умолчанию настроен для запуска его вне chroot “окружения”. Мы должны внести следующие изменения в файл named (vi /etc/rc.d/init.d/named), чтобы исправить это:

[ -f /usr/sbin/named ] exit 0

Должна читаться:

[ -f /chroot/named/usr/sbin/named ] exit 0

[ -f /etc/named.conf ] exit 0

Должна читаться:

[ -f /chroot/named/etc/named.conf ] exit 0

daemon named

Должна читаться:

daemon /chroot/named/usr/sbin/named -t /chroot/named/ -unamed -gnamed

Опция “-t” говорит “named” запускаться, используя новое chroot окружение.

Опция “-u” определяет пользователя от имени которого стартует named.



Опция “-g” определяет группу от имени которой стартует named.

Шаг 9

В BIND 8.2, команда “ndc” стала двоичным файлом (ранее, это был скрипт), которая в этой конфигурации не работает. Чтобы исправить это, пакет ISC BIND/DNS должен быть скомпилирован из исходных кодов.

[root@deep /]# cp bind-src.tar.gz /vat/tmp

[root@deep /]# cd /var/tmp/

[root@deep tmp]# tar xzpf bind-src.tar.gz

[root@deep tmp]# cd src

[root@deep src]# cp port/linux/Makefile.set port/linux/Makefile.set-orig

Редактируем файл Makefile.set (vi port/linux/Makefile.set) и делаем в нем следующие изменения:

'CC=egcs -D_GNU_SOURCE'

'CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions -g’

'DESTBIN=/usr/bin'

'DESTSBIN=/chroot/named/usr/sbin'

'DESTEXEC=/chroot/named/usr/sbin'

'DESTMAN=/usr/man'

'DESTHELP=/usr/lib'

'DESTETC=/etc'

'DESTRUN=/chroot/named/var/run'

'DESTLIB=/usr/lib/bind/lib'

'DESTINC=/usr/lib/bind/include'

'LEX=flex -8 -I'

'YACC=yacc -d'

'SYSLIBS=-lfl'

'INSTALL=install'

'MANDIR=man'

'MANROFF=cat'

'CATEXT=$$N'

'PS=ps p'

'AR=ar crus'

'RANLIB=:'

Различие между Makefile, который мы использовали прежде и новым, заключается в изменении строк “DESTSBIN=”, “DESTEXEC=” и “DESTRUN=”. В них мы задаем новое месторасположение файлов и теперь программа “ndc” будет знать, где находится “named”.

[root@deep src]# make clean

[root@deep src]# make

[root@deep src]# cp bin/ndc/ndc /usr/sbin/

[root@deep src]# cp: overwrite `/usr/sbin/ndc’? y

[root@deep src]# strip /usr/sbin/ndc

Мы создали двоичный файл, а затем копируем полученную программу “ndc” в “/usr/sbin”, переписывая старую. Мы не должны забыть выполнить команду strip для улучшения производительности.

Шаг 10

Также хорошей идеей будет создание новых двоичных файлов “named” и “named-xfer”, чтобы грантировано использовать одну и туже версию “named” и “ndc”.

Для named:

[root@deep /]# cd /var/tmp/src

[root@deep src]# cp port/linux/Makefile.set-orig port/linux/Makefile.set



[root@deep src]# cp: overwrite `port/linux/Makefile.set’? y

Редактируйте файл Makefile.set (vi port/linux/Makefile.set) и внесите в него следующие изменения:

'CC=egcs -D_GNU_SOURCE'

'CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions -g’

'DESTBIN=/usr/bin'

'DESTSBIN=/usr/sbin'

'DESTEXEC=/usr/sbin'

'DESTMAN=/usr/man'

'DESTHELP=/usr/lib'

'DESTETC=/etc'

'DESTRUN=/var/run'

'DESTLIB=/usr/lib/bind/lib'

'DESTINC=/usr/lib/bind/include'

'LEX=flex -8 -I'

'YACC=yacc -d'

'SYSLIBS=-lfl'

'INSTALL=install'

'MANDIR=man'

'MANROFF=cat'

'CATEXT=$$N'

'PS=ps p'

'AR=ar crus'

'RANLIB=:'

[root@deep src]# rm -f .settings

[root@deep src]# make clean

[root@deep src]# make

[root@deep src]# cp bin/named/named /chroot/named/usr/sbin

[root@deep src]# cp: overwrite `/chroot/named/usr/sbin/named’? y

[root@deep src]# cp bin/named-xfer/named-xfer /chroot/named/usr/sbin

[root@deep src]# cp: overwrite `/chroot/named/usr/sbin/named-xfer’? y

[root@deep src]# strip /chroot/named/usr/sbin/named

[root@deep src]# strip /chroot/named/usr/sbin/named-xfer

Мы удалили файл “.settings”, так как система кэширует в нем переменные и выполнили команду “make clean”, чтобы убедиться, что у нас не возникнут старые наложения. После того, как создан файл “named”, мы копируем его вместе с “named-xfer” в chroot каталог и используем команду “strip” для улучшения производительности новых исполняемых файлов.

Step 11

Удаление ненужных файлов и каталогов.

[root@deep /]# rm -f /usr/sbin/named

[root@deep /]# rm -f /usr/sbin/named-xfer

[root@deep /]# rm -f /etc/named.conf

[root@deep /]# rm -rf /var/named/

Мы удаляем “named” и “named-xfer” из “/usr/sbin”, так как они будут теперь запускаться из chroot каталога. Тоже самое проделываем и для файла “named.conf” и каталога “/var/named”.

Шаг 12

Мы должны тестировать новую chroot-овую конфигурацию ISC BIND/DNS.

Первое, перезапустите ваш syslogd демон:

[root@deep /]# /etc/rc.d/init.d/syslog restart Shutting down kernel logger: [ OK ] Shutting down system logger: [ OK ] Starting system logger: [ OK ] Starting kernel logger: [ OK ]



Теперь можно запустить chroot версию ISC BIND/DNS:

[root@deep /]# /etc/rc.d/init.d/named start Starting named: [ OK ]

Проверяем, что ISC BIND/DNS запущен от имени пользователя “named” с новыми аргументами:

[root@deep /]# ps auxw | grep named

named 11446 0.0 1.2 2444 1580 ? S 23:09 0:00 /chroot/named/usr/sbin/named -t /chroot/named/ -u named –g named

Первая колонка говорит, что программа запущена с UID “named”. Конец строки должен содержать “named -t /chroot/named/ -u named –g named”, представляющие из себя новые аргументы.

Очистка после работы

[root@deep /]# rm -rf /var/tmp/src bind-src.tar.gz

Эта команда перемещает исходные файлы и tar архив, которые мы использовали при компиляции и инсталляции ISC BIND/DNS.

Дополнительная документация

Для получения большей информации вы можете читать следующие страницы руководства:

$ man dnsdomainname (1) – показывает доменное имя системы

$ man dnskeygen (1) – создает публичный, приватный и разделяемый секретные ключи для DNS Security

$ man dnsquery (1) – запрос доменного имени, используя распознаватель (resolver)

$ man named (8) – сервер доменной службы имен (DNS)

$ man hesiod_to_bind [hesiod] (3) – Интерфейсная библиотека к серверу имен Hesiod

$ man ldconfig (8) – определяет связи времени выполнения

$ man lesskey (1) – определяет ключ связанный с less

$ man raw (8) - привязывает “сырые” символьные устройства Linux

$ man mkfifo (1) – создает FIFO (именные каналы)

$ man named-bootconf (8) – конвертирует конфигурационный файл сервера имен

$ man named-xfer (8) – вспомогательный агент для входящей зонной пересылки

$ man named.conf [named] (5) – конфигурационный файл

$ man Opcode (3) – Отключает opcode-ы named, когда компилируется perl код

$ man dig (1) – посылает запросы к серверу имен

$ man nslookup (8) – создание интерактивных запросов к серверу имен

$ man ndc (8) – программа контролирующая работу сервера имен


Содержание раздела