L i n u x P a r k при поддержке ВебКлуба |
Назад | Оглавление | Вперед |
Глава 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
Назад | Оглавление | Вперед |