Запуск BIND из chroot директории

Bind chrootПредположим у нас есть уже работающий и настроенный Bind сервер. Но для повышения его безопасности требуется запустить его в окружении chroot. Дополнительных пакетов в систему устанавливать не потребуется, можно просто переделать уже установленный в системе bind сервер для запуска в chroot.

Подготовка директорий chroot

Для запуска из chroot я создал директорию по пути /var/named/chroot. Внутри директории chroot я создал каталоги и соответствующие права (сервер bind будет запускаться от пользователя nobody)
/etc - сюда скопировать файлы из корневого /etc, - passwd, group, localtime, а также положить сюда файлы named.conf, rndc.key (файлы group, passwd можно урезать только до пользователей root и nobody)
/dev - права на каталог 755 nobody:nobody, а на файлы в нем 666 root:root - но это не принципиально (какие тут файлы читайте ниже)
/usr - сюда скопировать каталоги и файлы из пакета bind вашей системы, все что предназначалось для корневого /usr уже установленного bind пакета.
Еще один важный момент. Если ваш пакет bind собран с поддержкой openssl, то в каталог /var/named/chroot/usr необходимо положить библиотеку libgost.so по пути в котором эта библиотека лежит в системе. Например у меня эта библиотека находилась по пути /usr/lib/engines/libgost.so, а ее надо скопировать уже по пути /var/named/chroot/usr/lib/engines/libgost.so. Перед копированием библиотеки рекомендую проверить, что ваш openssl пакет уже обновлен до версии openssl-1.0.1g или выше.
/var - внутри /var создал директории ./log ./named ./run ./stat. Все каталоги принадлежат пользователю nobody

Настройка

Генерим новый файл ключа, который хранится в rndc.key


# dnssec-keygen -a HMAC-MD5 -b 128 -n USER rndckey

Эта команда создаст два файла в текущем каталоге. В файле *.private в третьей строке будет находится ключ вида:


PBpLBGUy6QRdCnUMwv9dxw==

Вот этот ключик и вставляем в файлик rndc.key, в каталог /var/named/chroot/etc. Также не забудьте положить в этот каталог все файлы, которые я перечисли выше.

Пример файла rndc.key, лучше на файл выставить права 600 nobody:nobody т.к. bind будет запускаться от этого пользователя


key "rndc-key" {
        algorithm hmac-md5;
        secret "PBpLBGUy6QRdCnUMwv9dxw==";
};

Теперь создаем файлы в каталоге /var/named/chroot/dev


#mknod /var/named/chroot/dev/null c 1 3
#mknod /var/named/chroot/dev/random c 1 8

В принципе почти все готово. Напоследок кладем в каталог /var/named/chroot/var/named файлы зон (localhost.zone named.local named.root)

Еще раз не забываем проверить права на каталоги для пользователя и группы nobody. На весь каталог в ./chroot/dev, ./chroot./var и на файлик rndc.key+права на этот файл 600.

Пишем или изменяем свой главный конфиг named.conf. Для данных каталогов, он выглядит так.


options {
directory "/var/named";
dump-file "/var/stat/cache_dump.db";
memstatistics-file "/var/stat/named.mem";
statistics-file "/var/stat/named_stats.txt";
pid-file "/var/run/named.pid";
#listen-on { 127.0.0.1; };
version "unknown";
allow-transfer { none; };
allow-recursion { trusted; };
allow-query { any; };
};

acl "trusted" {
    localhost;
    192.168.0.0/16;
     };

logging {
    channel default_ch {
        file "/var/log/named.log" versions 3 size 100k;
        severity info;
        print-time yes;
        print-category yes;
    };

    channel security_ch {
        file "/var/log/security.log" versions 3 size 100k;
        severity info;
        print-time yes;
        print-category yes;
    };

    category default { default_ch; };
    category security { security_ch; };
};

Не забываем, что пути в named.conf уже ведутся от каталога chroot!

Запуск

Запуск выполняем командой:


/var/named/chroot/usr/sbin/named -u nobody -t /var/named/chroot -c /etc/named.conf

Лучше первый раз выполнить команду с опцией -g, тогда сразу станет ясно где ошибки..
Например, ошибка при отсутствии библиотеки libgost.so из пакета openssl-1.0.1g.


ENGINE_by_id failed (crypto failure)
error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:244:
error:260B6084:engine routines:DYNAMIC_LOAD:dso not found:eng_dyn.c:450:
error:2606A074:engine routines:ENGINE_by_id:no such engine:eng_list.c:418:id=gost
initializing DST: crypto failure
exiting (due to fatal error)

А вот нормальный запуск пакета..
показать

Логи и прочюю статистику смотреть в каталоге chroot /var.

Теперь немного меняем скрипты запуска при старте ОС. Я приведу пример переделанного файла /etc/rc.d/rc.bind для запуска из chroot от Slackware 13.1 показать

Управление BIND-ом

Управлять нашим bind сервером можно с помощью команды rndc [command]. Т.к. мы создали ключик сервера, то этот ключик надо каждый раз подсовывать команде rndc


root@gw:/# rndc -k /var/named/chroot/etc/rndc.key status
number of zones: 11
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

Все команды rndc можно узнать выполнив команду


root@gw:/# rndc -k /var/named/chroot/etc/rndc.key
Usage: rndc [-c config] [-s server] [-p port]
        [-k key-file ] [-y key] [-V] command

command is one of the following:

  reload        Reload configuration file and zones.
  reload zone [class [view]]
                Reload a single zone.
  refresh zone [class [view]]
                Schedule immediate maintenance for a zone.
  retransfer zone [class [view]]
                Retransfer a single zone without checking serial number.
  freeze        Suspend updates to all dynamic zones.
  freeze zone [class [view]]
                Suspend updates to a dynamic zone.
  thaw          Enable updates to all dynamic zones and reload them.
  thaw zone [class [view]]
                Enable updates to a frozen dynamic zone and reload it.
  notify zone [class [view]]
                Resend NOTIFY messages for the zone.
  reconfig      Reload configuration file and new zones only.
  stats         Write server statistics to the statistics file.
  querylog      Toggle query logging.
  dumpdb [-all|-cache|-zones] [view ...]
                Dump cache(s) to the dump file (named_dump.db).
  stop          Save pending updates to master files and stop the server.
  stop -p       Save pending updates to master files and stop the server
                reporting process id.
  halt          Stop the server without saving pending updates.
  halt -p       Stop the server without saving pending updates reporting
                process id.
  trace         Increment debugging level by one.
  trace level   Change the debugging level.
  notrace       Set debugging level to 0.
  flush         Flushes all of the server's caches.
  flush [view]  Flushes the server's cache for a view.
  flushname name [view]
                Flush the given name from the server's cache(s)
  status        Display status of the server.
  recursing     Dump the queries that are currently recursing (named.recursing)
  validation newstate [view]
                Enable / disable DNSSEC validation.
  *restart      Restart the server.

* == not yet implemented
Version: 9.7.1

Последние штрихи

Заметаем присутствие bind в основной системе, чтобы не вносить путаницы:

  • Снимаем исполнение с файлика /usr/sbin/named
  • Удаляем /etc/named.conf и файлы зон из путей, которые были до перемещения сервера в chroot
Статья просмотрена 18 186 раз
Запись опубликована в рубрике Программы с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>