chrootowanie binda
ISC Bind jest uważany za najbardziej dziurawą usługę dla linuxa (patrz http://www.sans.org/top20/ ). W tym artykule omówię sposób na zamknięcie binda w jailu.
Potrzebny stuff:
źródło binda z www.isc.org (w tym przypadku użyłem 9.2.3, 9.3.0)
Przepis dotyczy dystrybucji Mandrake 9.1 (9.2 i 10 też są podatne - tylko wersje bibliotek z katalogu /lib są inne)
binda będziemy zamykali w /var/named i jest on katalogiem bieżącym dla wszystkich poleceń umieszczonych w tym dokumencie.
1) do pliku /etc/ld.so.conf dopisujemy:
/usr/local/lib
/usr/lib
i uruchamiamy ldconfig
2) Przygotowanie katalogu.
Jeżeli w systemie nie mamy usera named to tworzymy go:
# groupadd named
# useradd -g named -c "system user for bind" -s /bin/false -d /var/named named
Tworzymy następującą strukturę katalogów i kopiujemy odpowiednie pliki:
./bin/false
./etc/group (zostawiamy tylko wpis dot. grupy named)
./etc/passwd (zostawiamy tylko wpis dot. usera named)
./etc/shadow (zostawiamy tylko wpis dot. usera named)
./etc/ld.so.cache
./etc/localtime
./etc/protocols
./etc/resolv.conf
./etc/services
./etc/named.conf
./lib/ld-2.3.1.so
./lib/libc-2.3.1.so
./lib/libdl-2.3.1.so
./lib/libnsl-2.3.1.so
./lib/libpthread-0.10.so
./var/named/named.ca
./var/named/named.local
Oraz symlinki:
./lib/ld-linux.so.2
./lib/libc.so.6
./lib/libdl.so.2
./lib/libnsl.so.1
./lib/libpthread.so.0
Tworzymy następujące katalogi i ustawiamy właściciela na named:named
./var/log/
./var/run/named/
Jeżeli w ./var/named będziemy trzymali strefy typu slave to również zmieniamy właściciela tego katalogu.
Tworzymy katalog ./dev oraz:
# cd dev
# mknod null c 1 3
# mknod random c 1 8
# chmod 666 *
3) kompilacja
# cd katalog_z_rozpakowanymi_żródłami
# ./configure --prefix=/var/named/usr --sysconfdir=/var/named/etc --localstatedir=/var/named/var --enable-threads --with-libtool --disable-ipv6 --enable-libbind
# make
# make install
to co się znajdzie w katalogu ./usr/bin kopiujemy do /usr/bin
to co się znajdzie w katalogu ./usr/lib kopiujemy do /usr/lib
4) zmiany w syslogu.
w pliku /etc/sysconfig/syslog umieszczamy (zmieniamy) linię:
SYSLOGD_OPTIONS="-m 0 -a /var/named/dev/log"
i restartujemy /etc/init.d/syslog restart
5) Pliki konfiguracyjne.
w pliku /etc/sysconfig/named dopisujemy:
ROOTDIR="/var/named"A plik /etc/init.d/named można pobrać stąd (zmiany dotyczą dopisania ${ROOTDIR} przed poleceniami oraz parametru -c /etc/named.conf ).
6) Możliwe problemy.
Jeżeli bind się nie uruchamia to zaglądamy do pliku /var/log/syslog
Należy sprawdzić
- czy katalog ./var/run/named ma możliwość zapisu dla usera named
- czy przekopiowaliśmy wszystkie wyszczególnione pliki z katalogu /lib
- czy w ./dev są opisane pliki
- czy named jest uprawniony do odczytu wszystkich plików w /var/named (nie musi mieć prawa do zapisu, i nawet nie powinien)
Kernele z serii 2.6 kiepsko współpracują z bindem.
sypiąc błędami:
process `named' is using obsolete setsockopt SO_BSDCOMPAT
Na stronie http://www.hants.lug.org.uk/cgi-bin/wiki.pl?LinuxHints/RedHat_2.4_To_2.6_Kernel_Upgrade znalazłem przepis:
w pliku /lib/isc/unix/socket.c w linii 1347 (bind 9.3.1)
#if defined(USE_CMSG) || defined(SO_BSDCOMPAT)
int on = 1;
trzeba zmienić na:
#if defined(USE_CMSG)
int on = 1;
a następnie znaleźć i zakomentować (1432-1444)
/* Nick
#ifdef SO_BSDCOMPAT if (setsockopt(sock->fd, SOL_SOCKET, SO_BSDCOMPAT, (void *)&on, sizeof on) < 0) { isc__strerror(errno, strbuf, sizeof(strbuf)); UNEXPECTED_ERROR(__FILE__, __LINE__, "setsockopt(%d, SO_BSDCOMPAT) %s: %s", sock->fd, isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL, ISC_MSG_FAILED, "failed"), strbuf); /* Press on... /* } #endif */