Библиотека сайта rus-linux.net
Глава 14. Серверное программное обеспечение (BIND/Сервис DNS)
Linux DNS и BIND-сервер
Краткий обзор.
Сейчас, когда мы установили все программное обеспечение, предназначенное для зашиты сервера, самое время улучшить и настроить его сетевую часть. DNS наиболее важный сервис для IP-сетей и поэтому, все Linux-машины, клиенты DNS, должны быть, как минимум, настроены на функцию кэширования. Такая настройка на клиентской машине уменьшит загрузку сервера. Кэширующий сервер ищет ответы на DNS-запросы и сохраняет их до следующего раза. В результате время ответа на тот же самый запрос сильно сокращается.
Из соображений безопасности, важно, чтобы между внутренними компьютерами корпоративной сети и внешними компьютерами не существовало DNS, гораздо безопаснее использовать просто IP-адреса для соединения с внешними машинами и наоборот.
В нашей конфигурации мы будем запускать BIND/DNS от имени не root-пользователя и обрабатывать его окружение как chroot. Мы также предоставим три различные конфигурации: одну для простого кэширующего сервера (клиент), одну для вторичного сервера (secondary) и одну для основного (master) сервера.
Конфигурацию кэширующего сервера мы будем использовать на машине, которая не будет выполнять функции основного и вторичного DNS-серверов. Обычно один из серверов выступает в роли основного сервера, а другой подчиненного (slave).
Эти инструкции предполагают.
Unix-совместимые команды.
Путь к исходным кодам /var/tmp (возможны другие варианты).
Инсталляция была проверена на Red Hat Linux 6.1 и 6.2.
Все шаги инсталляции осуществляются суперпользователем root.
ISC BIND версии 8.2.2-patchlevel5.
Пакеты.
Домашняя страница ISC BIND:
http://www.isc.org,
FTP-сервер ISC BIND: 204.152.184.27,
Вы должны скачать: bind-contrib.tar.gz, bind-doc.tar.gz и bind-src.tar.gz.
find /* > DNS1
find /* > DNS2
diff DNS1 DNS2 > DNS-install
Раскройте архив:
[root@deep /]# mkdir /var/tmp/bind [root@deep /]# cp bind-contrib.tar.gz /var/tmp/bind/ [root@deep /]# cp bind-doc.tar.gz /var/tmp/bind/ [root@deep /]# cp bind-src.tar.gz /var/tmp/bind/
Мы создаем каталог с именем bind и манипулируем tar-архивами, копируя их в новый каталог.
Переходим в новый каталог bind (cd /var/tmp/bind) и разархивируем tar-файлы:
[root@deep bind]# tar xzpf bind-contrib.tar.gz [root@deep bind]# tar xzpf bind-doc.tar.gz [root@deep bind]# tar xzpf bind-src.tar.gz
Конфигурирование и оптимизация
Шаг 1.ISC BIND не должен запускаться с правами root, поэтому мы должны завести пользователя, не имеющего shell-доступа.
[root@deep /]# useradd -c "DNS Server" -u 53 -s /bin/false -r -d \ /chroot/named named 2>/dev/null || :
Шаг 2
Редактируем файл Makefile.set (vi src/port/linux/Makefile.set) и добавляем или модифицируем его:
'CC=egcs -D_GNU_SOURCE' 'CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro \ -arch=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=:'
Первая строки представляет имя Вашего GCC-компилятора (egcs), а вторая флаги оптимизации. Строка DESTLIB= определяет путь, где будут располагаться файлы сервера BIND.
Компиляция и оптимизация
Введите следующие команды в Вашем терминале
[root@deep bind]# make -C src [root@deep bind]# make clean all -C src SUBDIRS=../doc/man [root@deep bind]# make install -C src [root@deep bind]# make install -C src SUBDIRS=../doc/man
Команда make компилирует все исходные кода в двоичные исполняемые файлы, и затем команды make install инсталлируют исполняемые и сопутствующие им файлы в заданный каталог.
[root@deep bind]# strip /usr/bin/addr [root@deep bind]# strip /usr/bin/dig [root@deep bind]# strip /usr/bin/dnsquery [root@deep bind]# strip /usr/bin/host [root@deep bind]# strip /usr/bin/nslookup [root@deep bind]# strip /usr/bin/nsupdate [root@deep bind]# strip /usr/bin/mkservdb [root@deep bind]# strip /usr/sbin/named [root@deep bind]# strip /usr/sbin/named-xfer [root@deep bind]# strip /usr/sbin/ndc [root@deep bind]# strip /usr/sbin/dnskeygen [root@deep bind]# strip /usr/sbin/irpd [root@deep bind]# mkdir /var/named
Команда strip удаляет все символы из объектных файлов Это уменьшает размер исполняемых файла. Вследствие чего, улучшается производительность. Команда mkdir создает новый каталог /var/named.
Очистка после работы.
[root@deep /]# cd /var/tmp [root@deep tmp]# rm -rf bind
Эти команды будут удалять все исходные коды, которые мы использовали при компиляции и инсталляции ISC BIND/DNS.
Конфигурации
Конфигурационные файлы различных сетевых сервисов сильно зависят от Ваших нужд и архитектуры. Люди могут устанавливать DNS-сервер дома как кэширующий сервер, а в компании как основной, подчиненный или кэширующий DNS-сервер.
Все программное обеспечение, описанное в книге, имеет определенный каталог и подкаталог в архиве floppy.tgz, включающем все конфигурационные файлы для всех программ. Если Вы скачаете этот файл, то Вам не нужно будет вручную воспроизводить файлы из книги, чтобы создать свои файлы конфигурации. Скопируйте файл из архива и измените его под свои требования. Затем поместите его в соответствующее место на сервере так, как это показано ниже. Файл с конфигурациями Вы можете скачать с адреса http://www.openna.com/books/floppy.tgz.
Для запуска кэширующего сервера имен необходимы следующие файлы, Вы должны их либо создать либо скопировать в нужные каталоги сервера
Копируйте файл named.conf в каталог /etc.Копируйте файл db.127.0.0 в каталог /var/named.
Копируйте файл db.cache в каталог /var/named.
Копируйте скрипт named в каталог /etc/rc.d/init.d.
Для запуска основного (master) сервера имен необходимы следующие файлы, Вы должны их либо создать либо скопировать в нужные каталоги сервера
Копируйте файл named.conf в каталог /etc.Копируйте файл db.127.0.0 в каталог /var/named.
Копируйте файл db.cache в каталог /var/named.
Копируйте файл db.208.164.186 в каталог /var/named.
Копируйте файл db.openna в каталог /var/named.
Копируйте скрипт named в каталог /etc/rc.d/init.d.
Для запуска подчиненного сервера имен необходимы следующие файлы, Вы должны их либо создать либо скопировать в нужные каталоги сервера.
Копируйте файл named.conf в каталог /etc.Копируйте файл db.127.0.0 в каталог /var/named.
Копируйте файл db.cache в каталог /var/named.
Копируйте скрипт named в каталог /etc/rc.d/init.d.
Вы можете взять эти файлы из архива floppy.tgz.
Кэширующий сервер имен
Кэширующий сервер имен не авторитетен для любых доменов, кроме 0.0.127.in-addr.arpa (localhost). Он ищет имена как внутри, так и за пределами Ваших зон, как на первичных, так и на подчиненных серверах. В отличии от них, кэширующий сервер инициирует поиск имен в пределах Вашей зоны, спрашивая один из первичных или подчиненных серверов.
Файлы, необходимые для установки простого кэширующего сервера имен:
named.conf db.127.0.0 db.cache скрипт named
Конфигурация файла /etc/named.conf для простого кэширующего сервера имен.
Используйте эту конфигурацию для всех серверов в Вашей сети, которые не выступают как основной или подчиненный сервера имен. Установка простого кэширующего севера на локальной клиентской машине уменьшит загрузку первичного сервера. Многие пользователи, использующие dialup-соединения, могут использовать эту конфигурацию. Создайте файл named.conf (touch /etc/named.conf) и добавьте в него следующие строки:
options { directory "/var/named"; forwarders { 208.164.186.1; 208.164.186.2; }; forward only; }; // // a caching only nameserver config zone "." in { type hint; file "db.cache"; }; zone "0.0.127.in-addr.arpa" in { type master; file "db.127.0.0"; };
В строке forwarder 208.164.186.1 и 208.164.186.2 это IP-адреса Ваших основного (Master) и подчиненного (Slave) DNS-серверов. Это могут быть также адреса DNS-серверов Вашего провайдера или вообще любые другие сервера имен.
Для улучшения безопасности Вашего DNS-сервера Вы можете запретить ему контактировать со сторонними серверами, если свои серверы не работают или не отвечают. С опцией forward only, установленной в файле named.conf, сервер имен не будет контактировать с другими серверами для поиска информации, если серверы, на которые перенаправляются запросы, не отвечают.
Конфигурация файла /var/named/db.127.0.0 для простого кэширующего сервера имен
Используйте эту конфигурацию для всех серверов в Вашей сети, которые не выступают как основной или подчиненный сервера имен. Файл db.127.0.0 распространяется на сеть loopback. Создайте его в /var/named.
Создайте файл db.127.0.0 (touch /var/named/db.127.0.0) и внесите в него следующие строки:
$TTL 345600 @ IN SOA localhost. root.localhost. ( 00 ; Serial 86400 ; Refresh 7200 ; Retry 2592000 ; Expire 345600 ) ; Minimum IN NS localhost. 1 IN PTR localhost.
Конфигурация файла /var/named/db.cache для простого кэширующего сервера имен
Перед запуском Вашего DNS-сервера необходимо взять файл db.cache и поместить его в каталог /var/named. db.cache определяет серверы корневой зоны.
Используйте следующие команды на другом UNIX-компьютере для запроса нового файла db.cache для Вашего DNS-сервера или возьмите его с Вашего Red Hat Linux CD-ROM.
Для запроса нового файла db.cache для Вашего DNS-сервера используйте следующую команду:
[root@deep]# dig @.aroot-servers.net . ns > db.cache
Не забудьте скопировать файл db.cache в каталог /var/named на Вашем сервере после получения его из Интернет.
ЗАМЕЧАНИЕ. Внутренние адреса, подобные 192.168.1/24, не включаются в файлы конфигурации DNS из соображений безопасности. Очень важно, чтобы между внутренними хостами и внешними не существовал DNS.
Основной сервер имен
Первичный мастер-сервер имен читает файл с данными о зоне и отвечает за эту зону.
named.conf db.127.0.0 db.208.164.186 db.openna db.cache скрипт named
Конфигурация файла /etc/named.conf для первичного мастер-сервера
Используйте эту конфигурацию для серверов, которые выступают как мастер-серверы имен. После компиляции DNS необходимо установить первичное доменное имя сервера. Мы используем openna.com, как пример домена, предполагая, что используем IP-сеть с адресом 208.164.186.0. Для этого добавьте следующие строки в Ваш файл /etc/named.conf.
Создайте файл named.conf (touch /etc/named.conf) и добавьте следующее:
options { directory "/var/named"; fetch-glue no; recursion no; allow-query { 208.164.186/24; 127.0.0/8; }; allow-transfer { 208.164.186.2; }; transfer-format many-answers; }; // Эти файлы не привязаны к какой-либо зоне zone "." in { type hint; file "db.cache"; }; zone "0.0.127.in-addr.arpa" in { type master; file "db.127.0.0"; }; // Это файл Вашей первичной зоны zone "openna.com" in { type master; file "db.openna "; }; zone "186.164.208.in-addr.arpa" in { type master; file "db.208.164.186"; };
Опция fetch-glue no может использоваться в связке с опцией recursion no для предотвращения роста и разрушения кэша сервера. Также отключение рекурсии переведет Ваш сервер имен в пассивный режим, говорящий ему никогда не посылать запросы от имени другого сервера имен или ресолвера. Не рекурсивные серверы имен очень сложно обмануть при помощи атаки spoof, так как они не отправляют никакие запросы и, следовательно, не кэшируют никакие данные.
В строке allow-query 208.164.186/24 и 127.0.0/8 определяют IP-адреса, которым разрешено осуществлять запросы к серверу.
В строке allow-transfer 208.164.186.2 задает IP-адрес, которому разрешается принимать пересылки зон с сервера. Вы должны обеспечить, чтобы только Ваши вторичные серверы могли получать зоны с сервера. Эта информация часто используется спамерами и IP-спуферами.
ЗАМЕЧАНИЕ. Опции recursion no, allow-query и allow-transfer в файле named.conf используются для обеспечения большей безопасности сервера имен.
Конфигурация файла /var/named/db.127.0.0 для основного и вспомогательного серверов имен
Этот файл может быть использован как на основном, так и на вспомогательном серверах. Файл db.127.0.0 описывает сеть loopback. Создайте файл db.127.0.0 (touch /var/named/db.127.0.0) и добавьте в него следующую информацию:
; Revision History: April 22, 1999 - admin@mail.openna.com ; Start of Authority (SOA) records. $TTL 345600 @ IN SOA deep.openna.com. admin.mail.openna.com. ( 00 ; Serial 86400 ; Refresh 7200 ; Retry 2592000 ; Expire 345600 ) ; Minimum ; Name Server (NS) records. NS deep.openna.com. NS mail.openna.com. ; only One PTR record. 1 PTR localhost.
Конфигурация файла /var/named/db.208.164.186 для основного сервера имен
Используйте эту конфигурацию для сервера, который выступает в Вашей сети, как основной сервер имен. Файл db.208.164.186 привязывает имена хостов к адресам. Создайте следующий файл db.208.164.186 (touch /var/named/db.208.164.186) в каталоге /var/named:
; Revision History: April 22, 1999 - admin@mail.openna.com ; Start of Authority (SOA) records. $TTL 345600 @ IN SOA deep.openna.com. admin.mail.openna.com. ( 00 ; Serial 86400 ; Refresh 7200 ; Retry 2592000 ; Expire 345600 ) ; Minimum ; Name Server (NS) records. NS deep.openna.com. NS mail.openna.com. ; Addresses Point to Canonical Names (PTR) for Reverse lookups 1 PTR deep.openna.com. 2 PTR mail.openna.com. 3 PTR www.openna.com.
Конфигурация файла /var/named/db.openna для основного сервера имен
Используйте этот файл для сервера выступающего в роли основного сервера имен. Файл db.openna привязывает адреса к именам хостов. Создайте файл db.openna в каталоге /var/named (touch /var/named/db.openna):
; Revision History: April 22, 1999 - admin@mail.openna.com ; Start of Authority (SOA) records. $TTL 345600 @ IN SOA deep.openna.com. admin.mail.openna.com. ( 00 ; Serial 86400 ; Refresh 7200 ; Retry 2592000 ; Expire 345600 ) ; Minimum ; Name Server (NS) records. NS deep.openna.com. NS mail.openna.com. ; Mail Exchange (MX) records. MX 0 mail.openna.com. ; Address (A) records. localhost A 127.0.0.1 deep A 208.164.186.1 mail A 208.164.186.2 www A 208.164.186.3 ; Aliases in Canonical Name (CNAME) records. ;www CNAME deep.openna.com.
Конфигурация файла /var/named/db.cache для основного и подчиненного серверов имен
Перед запуском Вашего DNS-сервера Вы должны сделать копию файла db.cache и поместить его в каталог /var/named. Он говорит серверу, какие серверы отвечают за корневую зону.
Используйте следующую команду на другом UNIX-компьютере для получения нового файла db.cache или возьмите его с Вашего Red Hat Linux CD-ROM:
[root@deep /]# dig @.aroot-servers.net . ns > db.cache
Не забудьте скопировать файл db.cache в каталог /var/named после получения его из Интерент.
Вторичный сервер имен
Основное назначение вторичного сервера имен: разделение нагрузки с основным сервером и обработка запросов, если основной сервер не работает. Вторичный сервер загружает данные через сеть с другого сервера имен (обычно основного, но может и с другого вторичного). Этот процесс называется пересылкой зоны.
named.conf db.127.0.0 db.cache скрипт named
Конфигурация файла /etc/named.conf для вторичного сервера имен
Используйте эту конфигурацию для сервера выполняющего роль вторичного сервера имен. Вы должны модифицировать файл named.conf на вторичном сервере имен. Измените каждое вхождение master на slave, сделав исключение для 0.0.127.in-addr.arpa, и добавьте строку с IP-адресом первичного сервера, как это показано ниже.
Создайте файл named.conf (touch /etc/named.conf) и добавьте в него:
options { directory "/var/named"; fetch-glue no; recursion no; allow-query { 208.164.186/24; 127.0.0/8; }; allow-transfer { 208.164.186.1; }; transfer-format many-answers; }; // These files are not specific to any zone zone "." in { type hint; file "db.cache"; }; zone "0.0.127.in-addr.arpa" in { type master; file "db.127.0.0"; }; // These are our slave zone files zone "openna.com" in { type slave; file "db.openna"; masters { 208.164.186.1; }; }; zone "186.164.208.in-addr.arpa" in { type slave; file "db.208.164.186"; masters { 208.164.186.1; }; };
Этот файл говорит серверу, что он является вторичным для зоны openna.com и должен брать информацию об этой зоне с хоста 208.164.186.1. Вторичному серверу имен нет необходимости получать все файлы (db) через сеть, так как db-файлы db.127.0.0 и db.cache одинаковы как для основного, так и для вторичных серверов, поэтому Вы можете создать их локальные копии на вторичном сервере.
Копируйте файл db.cache с основного сервера на подчиненный.
Конфигурация скрипта /etc/rc.d/init.d/named для всех типов серверов имен
Сконфигурируйте скрипт /etc/rc.d/init.d/named для запуска и остановки демона DNS. Этот скрипт может быть использован для всех типов серверов (кэширующего, основного или подчиненного).
Создайте следующий скрипт named (touch /etc/rc.d/init.d/named):
#!/bin/sh # named Этот скрипт командного интерпретатора отвечает за запуск и # остановку (BIND DNS сервера). # # chkconfig: - 55 45 # description: named (BIND) is a Domain Name Server (DNS) \ # that is used to resolve host names to IP addresses. # probe: true # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 [ -f /usr/sbin/named ] || exit 0 [ -f /etc/named.conf ] || exit 0 RETVAL=0 # See how we were called. case "$1" in start) # Start daemons. echo -n "Starting named: " daemon named RETVAL=$? [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named echo ;; stop) # Stop daemons. echo -n "Shutting down named: " killproc named RETVAL=$? [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named echo ;; status) /usr/sbin/ndc status exit $? ;; restart) $0 stop $0 start ;; reload) /usr/sbin/ndc reload exit $? ;; probe) # named знает как правильно перезагружаться; мы не хотим использовать # linuxconf для перезагрузок /usr/sbin/ndc reload >/dev/null 2>&1 || echo start exit 0 ;; *) echo "Usage: named {start|stop|status|restart}" exit 1 esac exit $RETVAL
Сейчас надо сделать этот скрипт исполняемым и изменить права доступа, принятые по умолчанию:
[root@deep]# chmod 700 /etc/rc.d/init.d/named
Создайте символические ссылки в rc.d для BIND/DNS:
[root@deep]# chkconfig --add named
Скрипт BIND/DNS не будет автоматически стартовать, когда Вы перезагружаете сервер. Чтобы изменить это, выполните следующую команду:
[root@deep]# chkconfig --level 345 named on
Запустите вручную Ваш DNS-сервер:
[root@deep]# /etc/rc.d/init.d/named start Starting named: [ OK ]
Организация защиты ISC BIND/DNS
Запуск 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) о новом chroot-сервисе. Обычно процессы обращаются к 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 для улучшения производительности новых исполняемых файлов.
Шаг 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) программа, контролирующая работу сервера имен
Административные средства DNS
Команды, описанные ниже, мы будем часто использовать, но на самом деле их много больше, и вы должны изучить 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 Type help -or- /h if you need help. ndc> help getpid status stop exec reload [zone] ... reconfig (just sees new/gone zones) dumpdb stats trace [level] notrace querylog qrylog help quit ndc> /e
Утилиты пользователя DNS
Команды, описанные ниже, мы будем часто использовать, но на самом деле их много больше, и Вы должны изучить man-страницы и документацию для получения деталей.
nslookup
Программа nslookup позволяет пользователям интерактивно или неинтерактивно запрашивать серверы имен Интернет. В интерактивном режиме пользователи могут запрашивать у серверов имен информацию о различных хостах и доменах, печатать список хостов в домене. В неинтерактивном режиме пользователь может получить имена и запросить информацию о хостах и доменах.
Интерактивный режим имеет много опций и команд, рекомендуется прочитать страницу руководства для nslookup или дать команду help в интерактивном режиме.
Для запуска nslookup в интерактивном режиме используйте команду:
[root@deep /]# nslookup Default Server: deep.openna.com Address: 208.164.186.1 > help $Id: nslookup.help,v 8.4 1996/10/25 18:09:41 vixie Exp $
Команды (идентификаторы представлены в верхнем регистре, что делать необязательно):
NAME печатает информацию о хосте/домене NAME, используя сервер по умолчаниюNAME1 NAME2 то же, что и выше, но используется сервер NAME2
help или ? печатает информацию об основных командах, смотрите nslookup(1) для деталей
set OPTION устанавливает опции
all печатает опции, текущий сервер и хост
[no]debug печатает отладочную информацию
[no]d2 печатает полную отладочную информацию
Для запуска в неинтерактивном режиме используйте команду:
[root@deep /]# nslookup www.redhat.com Server: deep.openna.com Address: 208.164.186.1 Non-authoritative answer: Name: www.portal.redhat.com Addresses: 206.132.41.202, 206.132.41.203 Aliases: www.redhat.com
Где <www.redhat.com> это имя или Интернет-адрес, о котором Вы хотите получить информацию.
dnsquery
Программа dnsquery запрашивает серверы имен через библиотеку определителей. Для организации запроса на сервер имен, используя библиотеку определителей, введите следующую команду:
[root@deep /]# dnsquery <host>
Например:
[root@deep /]# dnsquery www.redhat.com ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40803 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 4 ;; www.redhat.com, type = ANY, class = IN www.redhat.com. 2h19m46s IN CNAME www.portal.redhat.com. redhat.com. 2h18m13s IN NS ns.redhat.com. redhat.com. 2h18m13s IN NS ns2.redhat.com. redhat.com. 2h18m13s IN NS ns3.redhat.com. redhat.com. 2h18m13s IN NS speedy.redhat.com. ns.redhat.com. 1d2h18m8s IN A 207.175.42.153 ns2.redhat.com. 1d2h18m8s IN A 208.178.165.229 ns3.redhat.com. 1d2h18m8s IN A 206.132.41.213 speedy.redhat.com. 2h18m13s IN A 199.183.24.251
где <host> имя хоста, информацию о котором Вы хотите получить.
host
Программа host определяет имя хоста, используя DNS. Для определения имен хоста используя сервер имен, введите следующую команду:
[root@deep /]# host <FQDN, domain names, host names, or host numbers>
Например:
[root@deep /]# host redhat.com redhat.com has address 207.175.42.154
где <FQDN, domain names, host names, or host numbers> FDQN (полностью определенное имя домена, www.redhat.com), domain names доменное имя (redhat.com), host names имя хоста (www) или host numbers IP-адрес хоста (207.175.42.154).
Для поиска всей информации, предоставляемой DNS о хосте, используйте команду:
[root@deep /]# host <-a domain names >Например:
[root@deep /]# host -a redhat.com Trying null domain rcode = 0 (Success), ancount=6 The following answer is not authoritative: The following answer is not verified as authentic by the server: redhat.com 8112 IN NS ns.redhat.com redhat.com 8112 IN NS ns2.redhat.com redhat.com 8112 IN NS ns3.redhat.com redhat.com 8112 IN NS speedy.redhat.com redhat.com 8112 IN A 207.175.42.154 redhat.com 11891 IN SOA ns.redhat.com noc.redhat.com( 2000021402 ;serial (version) 3600 ;refresh period 1800 ;retry refresh this often 604800 ;expiration period 86400 ;minimum TTL ) For authoritative answers, see: redhat.com 8112 IN NS ns.redhat.com redhat.com 8112 IN NS ns2.redhat.com redhat.com 8112 IN NS ns3.redhat.com redhat.com 8112 IN NS speedy.redhat.com Additional information: ns.redhat.com 94507 IN A 207.175.42.153 ns2.redhat.com 94507 IN A 208.178.165.229 ns3.redhat.com 94507 IN A 206.132.41.213 speedy.redhat.com 8112 IN A 199.183.24.251
Для получения полного описания домена используйте команду:
[root@deep /]# host <-l domain names >Например:
[root@deep /]# host -l openna.com openna.com name server deep.openna.com openna.com name server mail.openna.com localhost.openna.com has address 127.0.0.1 deep.openna.com has address 208.164.186.1 mail.openna.com has address 208.164.186.2 www.openna.com has address 208.164.186.3
Эта опция вызовет получение всех данных о зоне для доменного имени 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