Autor: Koji
Data: 03/09/2001
Chroot em BIND 8.X
1. Introdução
2. chroot ?
3. Preparativos antes de começar
4. Compilando e configurando
5. Parcheando o ndc
6. Ultimos ajustes
7. Despedida
Configuração provada em FreeBSD 4.3 + BIND 8.2.3
1. Introdução
Leste articulo vai destinado para aquelas pessoas que usam
FreeBSD e que desejam obter algo mas de segurança em sua BIND.
Durante todo o articulo se assume que o servo de nomes esta corretamente
configurado e funcionando, assim que se só procuras configurar um servo de nomes
este articulo não é para ti.
Há várias possibilidades à hora de configurar um meio chroot para o BIND, este articulo explica uma delas, concretamente a de como configurar um meio chroot usando um BIND compilado estaticamente. Não tenho nenhuma preferência por usar um BIND estático ou dinamico, simplesmente escolhi uma delas para que todo seja mas curto e claro.
Parto da base do BIND que incorpora FreeBSD em seu sistema base e de sua configuração por defeito. Se tens instalando posteriormente outro BIND mediante os ports ou compilandolo a mão, a informação que leias a continuação não pode ser do todo válida para ti.
Antes de começar assumo que:
Tens o CD de FreeBSD com suas fontes ou ao menos as tens instaladas
O diretório de trabalho de teu BIND é /etc/namedb (é o que vem por defeito)
Tens conhecimentos básicos do significado de estático , dinamico, libreria etc.
Durante todo o documento me referirei aos arquivos mediante sua rota absoluta para que não tenha confusões e fique todo mas claro.
2. chroot ?
Podemos definir chroot como uma chamada ao sistema que permite
configurar um diretório como raiz ("/") do sistema de ficheros
para um processo e seus filhos.
Por exemplo, e em nosso caso, se configuramos o chroot sob /etc/namedb/chroot
o BIND não poderá aceder a nenhum arquivo nem diretório que esteja por debaixo
do diretório chroot.
Cuales são as vantagens de todo isto?
A maior vantagem é a de incrementar a segurança de nosso BIND. Se se
desse alguma vulnerabilidade e alguma pessoa maliciosa conseguisse explodí-la
tão só se poderia apoderar do diretório chroot, ficando a salvo o resto
do sistema
Cuales são as desvantagens de todo isto?
Não muitas. A mas significativa é a de ter que tocar a configuração
do BIND para que trabalhe no diretório chroot, copiando assim todos os
arquivos especiais e configuração que precise para funcionar corretamente.
3. Preparativos antes de começar
Tão só precisaremos duas coisas para configurar o chroot em nosso FreeBSD: os sources e decidir onde colocaremos os binários e a configuração correspondente de nosso BIND.
Verdade é, que FreeBSD traz já o BIND em seu sistema base compilado e pronto para ser configurado, mas o que incorpora esta compilado dinamicamente, é por isso que deveremos de voltar a compilá-lo adicionando algumas opções de mas para que seja estático.
Para instalar as fontes (assegurai-vos antes de que não as tendes instaladas olhando em usr //src) tão só temos que executar /stand/sysinstall e ir ao menu Configure / Distributions onde marcaremos a seção src. Para não complicar a coisa elegeremos a opção All e selecionaremos o meio (normalmente CDROM). Isto instalará todas as fontes.
*NOTA PARA Os QUE VÃO ESCASSOS EM MEGAS*: Em princípio não faz defeituosa instalar todas as fontes. Se vais justo de megas seleciona as seções: contrib, libexec e usbin Essas seções deveriam bastar *
Agora que já temos as fontes necessárias elegeremos um diretório que será onde façamos o chroot. Eu durante todo o articulo vou usar como exemplo o diretório /etc/namedb/chroot vocês mudai-o a onde mas vos goste. Em princípio tanto dá onde o ubiquéis, assim que uma vez que o tenhais decidido creiamos os diretórios onde estarão os binários, configuração, etc.
mkdir /etc/namedb/chroot
mkdir /etc/namedb/chroot/etc
mkdir /etc/namedb/chroot/etc/namedb
mkdir /etc/namedb/chroot/usr
mkdir /etc/namedb/chroot/usr/sbin
mkdir /etc/namedb/chroot/usr/libexec
mkdir /etc/namedb/chroot/dev
mkdir /etc/namedb/chroot/var
mkdir /etc/namedb/chroot/var/run
mkdir /etc/namedb/chroot/etc/namedb/domínios
Este ultimo diretório faz referência ao diretório ou diretórios onde tenho a configuração de todos meus domínios, isto está especificado no /etc/namedb/named.conf para cada domínio:
%[...]
zone "eldemonio.org" { type master; file "domínios/eldemonio.org";
%[...]
4. Compilando e configurando
Para compilar o BIND estaticamente faremos o seguinte:
cd /usr/src/usr.sbin/named
make NOMAN=YES NOSHARED=YES NOPROFILE=YES BINDIR=/etc/namedb/chroot/usr/sbin
clean all install
cd /usr/src/libexec/named-xfer
make NOMAN=YES NOSHARED=YES NOPROFILE=YES BINDIR=/etc/namedb/chroot/usr/libexec
clean all install
Todo isto instalasse os binários named e named-xfer estaticamente no diretório indicado e sem as paginas man. (já as temos)
Podeis fazer uma prova singela para ver se todo marcha corretamente já que chegados a este ponto temos o BIND que instala FreeBSD por defeito em usr //sbin/named (dinâmico) e o que nós compilámos que esta situado em etc //namedb/chroot/usr/sbin/named (estático). Para confirmar todo isto podemos teclear o seguinte:
ldd /usr/sbin/named /usr/libexec/named-xfer
/usr/sbin/named: libc.so.4 => /usr/lib/libc.so.4 (0x280dd000)
/usr/libexec/named-xfer: libc.so.4 => /usr/lib/libc.so.4 (0x2809c000)
(Depende de livrarias)
ldd /etc/namedb/chroot/usr/sbin/named /etc/namedb/chroot/usr/libexec/named-xfer
ldd: /etc/namedb/chroot/usr/sbin/named: not a dynamic executable
ldd: /etc/namedb/chroot/usr/libexec/named-xfer: not a dynamic executable
(Não depende de livrarias)
Mesmo falta copiar todos os arquivos de configuração do named e nossos domínios, em meu caso faço o seguinte:
cd /etc/namedb
cp -p localhost.rev named.conf named.root /etc/namedb/chroot/etc/namedb
cp -pr domínios /etc/namedb/chroot/etc/namedb
Nosso BIND correrá com o usuário e o grupo bind (menos privilégios que root, é dizer, maior segurança). FreeBSD vem por defeito com o usuário e grupo criado, mas nunca esta de mas comprová-lo:
grep bind /etc/passwd /etc/group
/etc/passwd:bind:*:53:53:Bind Sandbox:/:/sbin/nologin
/etc/group:bind:*:53:
Se os possuímos só fica dar os privilégios necessários:
chown bind:bind /etc/namedb/chroot/etc/namedb/domínios
chmod 750 /etc/namedb/chroot/etc/namedb/domínios
named também precisa o device null e o arquivo localtime para logear com a hora correta se fizéssemos uso de syslogd :
cd /etc/namedb/chroot/dev
mknod null c 2 2.
cp -p /etc/localtime /etc/namedb/chroot/etc
5. Parcheando o ndc
BIND traz uns scripts para facilitar-nos a tarefa do reiniciado do named (/usr/sbin/named.reload e /usr/sbin/named.restart). Estes scripts fazem uso do programa ndc o qual serve para realizar muitas operações relacionadas com o named. No entanto este programa esta compilado para trabalhar nos diretórios /var/run /usr/sbin etc. Para poupar-nos a pesada faena de ir editando arquivos e compilar de novo o ndc faremos um pequeno parche para que possamos usá-lo em nosso diretório chroot.
Primeiro renombramos o original ndc a ndc .real:
mv /usr/sbin/ndc /usr/sbin/ndc.real
Agora criaremos o arquivo /usr/sbin/ndc com o seguinte conteúdo:
#!/bin/sh
exec ndc.real -c /etc/namedb/chroot/var/run/ndc "$@"
Só fica dar-lhe permissões de execução:
chmod 555 /usr/sbin/ndc
6. Ultimos ajustes
Temos que modificar ligeiramente nosso /etc/rc.conf para que
comece a funcionar nosso named em chroot, assim que TODAS as opções
referentes
ao BIND ficassem assim:
named_enable="YES"
named_program="/etc/namedb/chroot/usr/sbin/named"
named_flags="-ou bind -g bind -t /etc/namedb/chroot"
syslogd_flags="-s -l /etc/namedb/chroot/dev/log"
Como veis estamos indicando que o programa named (o estático) esta
em etc //namedb/chroot/usr/sbin/named
Também indicámos que named se execute com privilégios de usuário e grupo bind
e lhe passámos o diretório chroot com o parametro -t.
Por ultimo a linha referente a syslogd criará um arquivo especial
chamado /etc/namedb/chroot/var/run/log que servirá para logear as
ações do named através do syslogd. Se quereis guardar estes logs
tão só temos que tocar ligeiramente o /etc/syslog.conf com a linha:
!named
*.*
/var/log/named
Assegurai-vos de criar o arquivo /var/log/named antes de fazer o reboot
E agora já por fim, o mas fácil, reiniciar nossa maquina :-)
7. Despedida
Pois como digo sempre, qualquer dúvida, comentário ou rectificación hacedmelo saber ;-)
koji@jet.é