Назад | Оглавление | Вперед |
Глава 14 Серверное программное обеспечение (BIND/Сервис DNS) (Часть2)В этой главеLinux DNS и BIND сервер Конфигурации Кэширующий DNS-сервер Основной сервер имен Вторичный сервер имен Организация защиты ISC BIND/DNS Административные средства DNS Утилиты пользователя DNS |
Эта часть фокусируется на предотвращении использования 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Сделайте себе соответствующую отметку, чтобы можно было использовать ее позже на следующих шагах.
Шаг 2
Сейчас мы должны определить chroot окружение и создавать корневой каталог для него. Мы выбрали каталог "/chroot/named", потому что хотим разместить ее на независимом разделе, чтобы предотвратить атаки на файловую систему. Раньше, во время инсталляции Linux мы создали раздел "/chroot" специально предназначенный для этого.
[root@deep /]# /etc/rc.d/init.d/named stop (требуется ввести только если сещуствующий named демон запущен)Сейчас копируем основные конфигурационные файлы, файлы с описаниями зон, программы named named-xfer в необходимые места:
[root@deep /]# cp /etc/named.conf /chroot/named/etc/ВАЖНОЕ ЗАМЕЧАНИЕ. Для подчиненного сервера имен владельцем каталога "/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/Шаг 4
Копируйте файлы "localtime" и "nsswitch.conf" в chroot каталог etc, чтобы элементы файлов регистрации были правильно установлены для вашей временной зоны:
[root@deep /]# cp /etc/localtime /chroot/named/etc/Шаг 5
Для большей безопасности на некоторые файлы из каталога "/chroot/named/etc" мы должны установить бит постоянства:
[root@deep /]# cd /chroot/named/etc/Файл с атрибутом "+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Редактируем файл Makefile.set (vi port/linux/Makefile.set) и делаем в нем следующие изменения:
'CC=egcs -D_GNU_SOURCE'Различие между Makefile, который мы использовали прежде и новым, заключается в изменении строк "DESTSBIN=", "DESTEXEC=" и "DESTRUN=". В них мы задаем новое месторасположение файлов и теперь программа "ndc" будет знать, где находится "named".
[root@deep src]# make cleanМы создали двоичный файл, а затем копируем полученную программу "ndc" в "/usr/sbin", переписывая старую. Мы не должны забыть выполнить команду strip для улучшения производительности.
Шаг 10
Также хорошей идеей будет создание новых двоичных файлов "named" и "named-xfer", чтобы грантировано использовать одну и туже версию "named" и "ndc".
Для named:
[root@deep /]# cd /var/tmp/srcРедактируйте файл Makefile.set (vi port/linux/Makefile.set) и внесите в него следующие изменения:
'CC=egcs -D_GNU_SOURCE'Мы удалили файл ".settings", так как система кэширует в нем переменные и выполнили команду "make clean", чтобы убедиться, что у нас не возникнут старые наложения. После того, как создан файл "named", мы копируем его вместе с "named-xfer" в chroot каталог и используем команду "strip" для улучшения производительности новых исполняемых файлов.
Step 11
Удаление ненужных файлов и каталогов.
[root@deep /]# rm -f /usr/sbin/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Первая колонка говорит, что программа запущена с 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) - программа контролирующая работу сервера имен
Команды описанные ниже мы будем часто использовать, но на самом деле их много больше, и вы должны изучить man-страницы и документацию для получения деталей.
digУтилита "dig" (domain information groper) может быть использована для обновления файла "db.cache", который говорит вашему серверу какие сервера отвечают за корневую зоны. Такие сервера изменяются чрезвычайно редко. Хорошей идеей будет обновлять ваш файл каждые один-два месяца.
Используйте следующую команду для получения нового файла db.cache:
[root@deep /]# dig @.aroot-servers.net . ns > db.cacheКопируйте, полученный файл db.cache в каталог /var/named/.
[root@deep /]# cp db.cache /var/named/Где @a.root-servers.net - это адрес root сервера у которого вы спрашиваете о новой файле db.cache и db.cache - имя вашего нового db.cache файла.
ndcУтилита "ndc", входящая в ISC BIND/DNS, позволяет системному администратору из терминала интерактивно контролировать деятельность сервера имен.
Наберите на вашем терминале ndc и затем help, чтобы увидеть список доступных команд.
[root@deep /]# ndcКоманды описанные ниже мы будем часто использовать, но на самом деле их много больше, и вы должны изучить man-страницы и документацию для получения деталей.
nslookupПрограмма nslookup позволяет пользователям интерактивно или не интерактивно запрашивать сервера имен Интернет. В интерактивном режиме пользователи могут запрашивать у серверов имен информацию о различных хостах и доменах, печатать список хостов в домене. В не интерактивном режиме пользователь может получить имена и запросить информацию о хостах и доменах.
Интерактивный режим имеет много опций и команд; рекомендуется прочитать страницу руководства для nslookup или дать команду help в интерактивном режиме.
Для запуска nslookup в интерактивном режиме используйте команду:
[root@deep /]# nslookupКоманды: (идентификаторы представлены в верхнем регистре, что делать не обязательно)
NAME - печатает информацию о хосте/домене NAME, используя сервер по умолчаниюДля запуска в не интерактивном режиме используйте команду:
[root@deep /]# nslookup www.redhat.comГде <www.redhat.com> это имя или Интернет адрес о котором вы хотите получить информацию.
dnsqueryПрограмма dnsquery запрашивает сервера имен через библиотеку определителей.Для организации запроса на сервер имен, используя библиоткеку определителей, введите следующую команду:
[root@deep /]# dnsquery <host>Например:
[root@deep /]# dnsquery www.redhat.comгде <host> - имя хоста информацию о котором вы хотите получить.
hostПрограмма host определяет имя хоста, используя DNS. Для определения имен хоста используя сервер имен, введите следующую команду:
[root@deep /]# host <FQDN, domain names, host names, or host numbers>Например:
[root@deep /]# host redhat.comгде <FQDN, domain names, host names, or host numbers> FDQN - полностью определенное имя домена (www.redhat.com), domain names - доменное имя (redhat.com), host names - имя хоста (www) или host numbers - адрес хоста (207.175.42.154).
Для поиска всей информации предоставляемой DNS о хосте используйте команду:
[root@deep /]# host <-a domain names >Для получения полного описания домена используйте команду:
[root@deep /]# host <-l domain names >Эта опция вызовет получение всех данных о зоне для доменного имени "openna.com". Подобная команды должна использоваться только если это действительно необходимо.
> /etc/rc.d/init.d/named
> /etc/rc.d/rc0.d/K45named
> /etc/rc.d/rc1.d/K45named
> /etc/rc.d/rc2.d/K45named
> /etc/rc.d/rc3.d/K45named
> /etc/rc.d/rc4.d/K45named
> /etc/rc.d/rc5.d/K45named
> /etc/rc.d/rc6.d/K45named
> /etc/named.conf
> /usr/bin/addr
> /usr/bin/nslookup
> /usr/bin/dig
> /usr/bin/dnsquery
> /usr/bin/host
> /usr/bin/nsupdate
> /usr/bin/mkservdb
> /usr/lib/bind
> /usr/lib/bind/include/hesiod.h
> /usr/lib/bind/include/sys
> /usr/lib/bind/include/net
> /usr/lib/bind/lib
> /usr/lib/bind/lib/libbind.a
> /usr/lib/bind/lib/libbind_r.a
> /usr/lib/nslookup.help
> /usr/man/man1/dig.1
> /usr/man/man1/host.1
> /usr/man/man1/dnsquery.1
> /usr/man/man1/dnskeygen.1
> /usr/man/man3/hesiod.3
> /usr/man/man3/gethostbyname.3
> /usr/man/man3/inet_cidr.3
> /usr/man/man3/resolver.3
> /usr/man/man3/getnetent.3
> /usr/man/man3/tsig.3
> /usr/lib/bind/include
> /usr/lib/bind/include/arpa
> /usr/lib/bind/include/arpa/inet.h
> /usr/lib/bind/include/arpa/nameser.h
> /usr/lib/bind/include/arpa/nameser_compat.h
> /usr/lib/bind/include/isc
> /usr/lib/bind/include/isc/eventlib.h
> /usr/lib/bind/include/isc/misc.h
> /usr/lib/bind/include/isc/tree.h
> /usr/lib/bind/include/isc/logging.h
> /usr/lib/bind/include/isc/heap.h
> /usr/lib/bind/include/isc/memcluster.h
> /usr/lib/bind/include/isc/assertions.h
> /usr/lib/bind/include/isc/list.h
> /usr/lib/bind/include/isc/dst.h
> /usr/lib/bind/include/isc/irpmarshall.h
> /usr/lib/bind/include/netdb.h
> /usr/lib/bind/include/resolv.h
> /usr/lib/bind/include/res_update.h
> /usr/lib/bind/include/irs.h
> /usr/lib/bind/include/irp.h
> /usr/man/man3/getaddrinfo.3
> /usr/man/man3/getipnodebyname.3
> /usr/man/man5/resolver.5
> /usr/man/man5/irs.conf.5
> /usr/man/man5/named.conf.5
> /usr/man/man7/hostname.7
> /usr/man/man7/mailaddr.7
> /usr/man/man8/named.8
> /usr/man/man8/ndc.8
> /usr/man/man8/named-xfer.8
> /usr/man/man8/named-bootconf.8
> /usr/man/man8/nslookup.8
> /usr/man/man8/nsupdate.8
> /usr/sbin/ndc
> /usr/sbin/named
> /usr/sbin/named-xfer
> /usr/sbin/irpd
> /usr/sbin/dnskeygen
> /usr/sbin/named-bootconf
> /var/named
Назад | Оглавление | Вперед |