5.7.1. Configuração do Bind para evitar má utilização
Você deverá restringir algumas das informações que são servidas pelo BIND para clientes externos, assim não poderão ser usadas para obter informações sobre sua empresa que não deseja dar. Isto inclui adicionar as seguintes opções: allow-transfer, allow-query, allow-recursion e version. Você pode ou limitar esta seção global (assim aplicando a todas as zonas que são servidas) ou por zona. Esta informação está incluída no pacote bind-doc, leia mais sobre isto em /usr/share/doc/bind/html/index.html
assim que o pacote for instalado.
Imagine que seu servidor (um servidor básico contendo múltiplos endereços) está conectado à Internet e à sua rede interna (seu endereço IP é 192.168.1.2), você não vai querer oferecer qualquer serviço para os computadores. Você poderá restringir o bind incluindo o seguinte no
/etc/bind/named.conf
:
options {
\t allow-query { 192.168.1/24; } ;
\t allow-transfer { none; } ;
\t allow-recursion { 192.168.1/24; } ;
\t listen-on { 192.168.1.2; } ;
\t forward { only; } ;
\t forwarders { A.B.C.D; } ;
};
A opção listen-on faz o BIND ser executado somente na interface que tem o endereço interno, mas, até mesmo se esta interface for a mesma que te conecta a internet (caso estiver usando NAT, por exemplo), as requisições serão aceitas somente se estiverem vindo de suas máquinas internas. Se o sistema tiver múltiplas interfaces e a opção listen-on não estiver presente, somente usuários internos poderão fazer requisições, mas, como a porta está acessível para possíveis invasores externos, eles podem tentar travar (ou tentar realizar ataques de estouro de buffer) no servidor DNS. Você poderia até fazê-lo escutar somente em 127.0.0.1, se não estiver oferecendo o serviço de DNS em qualquer outro sistema além do seu.
O registro version.bind na classe chaos contém a versão do processo do bind atualmente em execução. Esta informação é freqüentemente usada por scaneadores automáticos e individualmente por pessoas maliciosas que desejam determinar se o bind é vulnerável a um ataque específico. Oferecendo informações falsas ou não fornecendo informações ao registro version.bind, diminui a probabilidade que o servidor seja atacado baseado na versão publicada. Para fornecer sua própria versão, use a diretiva
version da seguinte forma:
options { ... várias opções aqui ...
version "Não disponível."; };
A alteração do registro version.bind não oferece proteção atualmente contra ataques, mas pode ser considerado útil para a segurança.
Um arquivo simples de configuração
named.conf
pode ser o seguinte:
acl internal {
127.0.0.1/32; // localhost
10.0.0.0/8; // interna
aa.bb.cc.dd; // IP da eth0
};
acl friendly {
ee.ff.gg.hh; // DNS escravo
aa.bb.cc.dd; // IP da eth0
127.0.0.1/32; // localhost
10.0.0.0/8; // interna
};
options {
directory "/var/cache/bind";
allow-query { internal; };
allow-recursion { internal; };
allow-transfer { none; };
};
// A partir daqui, a zona mysite.bogus é
// basicamente uma versão não modificada do padrão do Debian
logging {
category lame-servers { null; };
category cname { null; };
};
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
// zones I added myself
zone "mysite.bogus" {
type master;
file "/etc/bind/named.mysite";
allow-query { any; };
allow-transfer { friendly; };
};
Por favor (novamente) verifique o Sistema de Tratamento de Falhas a respeito do bind, especificamente
http://bugs.debian.org/94760. Sinta-se livre para contribuir para relatar falhas se achar que podem adicionar informações úteis.
5.7.2. Alterando o usuário do BIND
Com relação a limitação de privilégios do BIND, você deverá estar ciente que se um usuário não root executa o BIND, então o BIND não detectará novas interfaces automaticamente, por exemplo, se colocar uma placa PCMCIA no notebook. Verifique o arquivo README.Debian na documentação do named veja o diretório (
/usr/share/doc/bind/README.Debian
) para mais informações sobre este assunto. Ocorreram muitos problemas de segurança recentes relacionados com o BIND, assim a alteração do usuário é mais útil quando possível. Nós detalharemos os passos para fazer isto, no entanto, se quiser fazer isto de uma forma automática, tente o script fornecido em
Seção B.5, “Exemplo de script para alterar a instalação padrão do Bind.”.
Notice, in any case, that this only applies to BIND version 8. In the Debian packages for BIND version 9 (since the 9.2.1-5 version, available since sarge) the bind user is created and used by setting the OPTIONS variable in /etc/default/bind9
. If you are using BIND version 9 and your name server daemon is not running as the bind user verify the settings on that file.
Para executar o BIND sob um usuário diferente, primeiro crie um usuário separado e um grupo (
não é uma boa idéia usar o nobody ou nogroup para cada serviço que não estiver sendo executado como root). Neste exemplo, o usuário e grupo
named
serão usados. Você poderá fazer isto da seguinte forma:
addgroup named
adduser --system --home /home/named --no-create-home --ingroup named \
--disabled-password --disabled-login named
Note que o usuário
named
será bastante restringido. Se você quiser, por alguma razão, ter uma configuração menos restrita, utilize:
adduser --system --ingroup named named
Agora, edite o arquivo
/etc/init.d/bind
com seu editor favorito e altere a linha que começa com
start-stop-daemon --start
para
start-stop-daemon --start --quiet --exec /usr/sbin/named -- -g named -u named
Or you can change (create it if it does not exit) the default configuration file (
/etc/default/bind
for BIND version 8) and introduce the following:
OPTIONS="-u named -g named"
Altere as permissões dos arquivo que são usados pelo Bind, incluindo
/etc/bind/rndc.key
:
-rw-r----- 1 root named 77 Jan 4 01:02 rndc.key
e onde o bind cria seu arquivo de pid, usando, por exemplo,
/var/run/named
ao invés de
/var/run
:
$ mkdir /var/run/named
$ chown named.named /var/run/named
$ vi /etc/named.conf
[ ... atualize o arquivo de configuração para sua nova localização ...]
options { ...
pid-file "/var/run/named/named.pid";
};
[ ... ]
Also, in order to avoid running anything as root, change the
reload
line in the init.d script by substituting:
reload)
/usr/sbin/ndc reload
to:
reload)
$0 stop
sleep 1
$0 start
Nota: Dependendo de sua versão do Debian, você deverá também alterar a linha restart
. Isto foi corrigido na versão do Bind do Debian 1:8.3.1-2
.
Tudo que precisa fazer agora é reiniciar o bind via '/etc/init.d/bind restart', e então procurar em seu syslog pelas seguintes duas linhas, como estas:
Sep 4 15:11:08 nexus named[13439]: group = named
Sep 4 15:11:08 nexus named[13439]: user = named
5.7.3. Executando o servidor de nomes em uma jaula chroot
Para obter o máximo de segurança no BIND, agora construa uma jaula chroot (veja
Seção 5.10, “Paranóia geral do chroot e suid”) em torno do seu daemon. Existe um método fácil de se fazer isto: a opção
-t
(veja a
named(8) página de manual ou a página 100 do
http://www.nominum.com/content/documents/bind9arm.pdf). Isto instruirá o Bind a fazer uma jaula de si mesmo em um diretório especificado sem a necessidade de configurar uma jaula chroot e se preocupar com as bibliotecas dinâmicas. Os únicos arquivos que precisam estar na jaula são:
dev/null
etc/bind/ - deverá ter o named.conf e todas as zonas do servidor
sbin/named-xfer - se fizer transferências de nomes
var/run/named/ - deverá ter a pid e o nome do servidor de cache (se tiver)
este diretório precisa ter permissões de gravação para o
usuário named.
var/log/named - se configurar o log para um arquivo, este precisa ter permissões
de gravação para o usuário named
dev/log - o syslogd deverá estar escutando aqui caso o named estiver
configurado para realizar logs através dele.
Para seu daemon do Bind funcionar adequadamente, ele precisará de permissões nos arquivos do named. Esta é uma tarefa simples, pois os arquivos de configuração estão sempre localizados em /etc/named/
. Tenha em mente que ele somente precisa de acesso de leitura aos arquivos de zonas, a não ser que seja um DNS secundário ou servidor de cache de nomes. Se este é seu caso, você terá que dar permissões completas para as zonas necessárias (assim as zonas transferidas do servidor principal funcionarão).
If you are setting up a full chroot jail (i.e. not just
-t
) for Bind in Debian, make sure you have the following files in it
:
dev/log - o syslogd deverá estar escutando aqui
dev/null
etc/bind/named.conf
etc/localtime
etc/group - com somente uma linha simples: "named:x:GID:"
etc/ld.so.cache - gerado com o ldconfig
lib/ld-2.1.3.so
lib/libc-2.1.3.so
lib/ld-linux.so.2 - link simbólico para ld-2.1.3.so
lib/libc.so.6 - link simbólico para libc-2.1.3.so
sbin/ldconfig - pode ser apagado após configurar a jaula chroot
sbin/named-xfer - se fizer transferências de nomes
var/run/
Também modifique o syslogd
para escutar no $CHROOT/dev/log assim o servidor de nomes poderá gravar entradas do syslog no log local do sistema.
Se deseja evitar problemas com bibliotecas dinâmicas, você poderá compilar o binário estaticamente. Você poderá usar o
apt-get
para fazer isto, com a opção
source
. Ele pode até mesmo baixar os pacotes que precisa para compila-los adequadamente. Você deverá fazer algo similar a isto:
$ apt-get source bind
# apt-get build-dep bind
$ cd bind-8.2.5-2
(edit src/port/linux/Makefile so CFLAGS includes the '-static'
option)
$ dpkg-buildpackage -rfakeroot -uc -us
$ cd ..
# dpkg -i bind-8.2.5-2*deb
After installation, you will need to move around the files to the chroot jail
you can keep the
init.d
scripts in
/etc/init.d
so that the system will automatically start the name server, but edit them to add
--chroot /location_of_chroot
in the calls to
start-stop-daemon
in those scripts or use the
-t option for BIND by setting it in the OPTIONS argument at the
/etc/default/bind
(for version 8) or
/etc/default/bind9
(for version 9) configuration file.