Ubuntu na terra do pão di queijo

26/12/2007

Firewall XEN com DMZ para dom0 e outras domU’s parte 1

Filed under: Segurança,Software Livre — Leonardo Amaral @ 7:16
Tags: , , , , , , , ,

Tive necessidade de migrar um servidor (mais parecia um Compaq Presario, mas tudo bem) para um Dell PowerEdge 1950. E considerando que a rede em que foi instalada é porca (Uma rede inteira pra pagar de GW pra um apunhado doutras redes), ví que manter a mesma maquina pagando de firewall com serviços (MTA/Web/LDAP) não ia ser nada seguro. Para não desperdiçar potência e manter as coisas em ordem, decidi montar, com Xen, duas maquinas paravirtualizadas; uma como firewall e a outra segurando os serviços.

Não cobrirei o processo de instalação do XEN. Tem bastantes tutoriais espalhados pela internet (vide http://wiki.xen-br.org) e o processo e facil, visto que inclui a compilação do XEN 3.1. Lembrando que para cada VM, a pasta /lib/modules/seukernellindoefofoversao0-0-0.xen precisa ser copiado para o mesmo lugar nas domUs (tem explicação lógica e da pra fazer mais simples, mas não testei).

PCIBACK:

O módulo pciback permite monopolizar os canais da ponte PCI para ele, de forma que ele pode redirecionar as portas diretamente para uma máquina desprivilegiada. Desta forma, pode-se alocar placas que serão somente enxergadas na maquina virtual de sua preferencia. Isso será feito para fazer com que a domU Firewall monopolize as placas de rede, de forma que fique mais seguro, já que agora sua dom0 não está sujeita a ataques diretos via placa de rede. O pciback pode ser compilado como módulo ou builtin no kernel. Eu se fosse você rezava pra ela ir no kernel (para saber: depmod -a ; modinfo pciback; Se algo aparecer, é porque está como módulo) porque ele como módulo precisa de uma série de workarrounds. Um deles é que ele tem que ser inicializado primeiro, antes das placas de rede, ou então ter os modulos descarregados antes do pciback ser levantado (e as bnx2 nem mesmo blacklistando resolveum, só renomeando o arquivo mesmo (sem rodar depmod, senão ele volta). Outro problema e que se o módulo capotar por algum motivo qualquer, todo o processo de reconhecimento e transporte da PCI precisa ser refeito.

Quando se tem o pciback builtin (embutido), basta adicionar uma opção no bootloader, na sessão module que contem o kernel, desta forma:

pciback.hide=(0000:11:22.3,1111:11:22:3)

Onde 0000 e 1111 e o dominio (pode ser omitido pois maioria dos sistemas só tem 1 bridge PCI) e 11:22:3 é o endereço da pci (pode ser visto com lspci).

Se você o tiver em modulo, podes usar este script de inicialização:

wget http://www.leleobhz.org/utils/pciback -O /etc/init.d
chmod a+rx /etc/init.d/pciback
update-rc.d pciback start 00 2 3 4 5 . stop 00 0 1 6 .

Pronto. Este script irá se inserir antes da inicialização do restante (Evitando problemas com placas broadcom, por exemplo, que tem sérios problemas para serem reiniciadas) e passar o controle das pcis listadas no script (Lembre-se, você precisa editar pelo menos a variavel SLOT).

E finalmente, para passar o controle para uma determinada domU, insira no seu arquivo de configuração:

pci = [ ’05:00.0′, ‘0b,00.0’ ]

Simples né?

Na domU fica assim:

firewall:~# lspci
00:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5708 Gigabit Ethernet (rev 12)
00:01.0 Ethernet controller: Intel Corporation 82572EI Gigabit Ethernet Controller (Copper) (rev 06)
firewall:~#

Simples e pratico.

DMZ:

Havia o problema das outras máquinas virtuais conversarem na rede. O modelo tradicional do XEN manda que para cada domU, haja uma xenbr pra ela ligando na placa de rede real. Como eu não fiz isso, ficou assim: A domU Firewall ficou responsável por todo o gerenciamento de rede, incluindo uma DMZ, que não passa das placas em bridge que o xen cria. O pulo do gato e colocar todas as domUs na mesma bridge (e dai elas comunicar-se-ao via xenbr). Fica mais facil vendo:

/etc/xen/firewall:

name = ‘firewall’
memory = 64
kernel = ‘/boot/vmlinuz-2.6-xen’
#ramdisk = ‘/boot/debian-install/initrd.gz’
ramdisk = ‘/boot/initrd.img-2.6.18-xen’
extra = ‘root=/dev/sda1’
disk = [‘phy:/dev/FIREWALL_DOMU/FIREWALL_ROOT,sda1,w’, ‘phy:/dev/FIREWALL_DOMU/FIREWALL_SWAP,sda2,w’]
pci = [ ’05:00.0′, ‘0b,00.0’ ]
vif = [ ‘mac=00:16:3e:3a:da:be, bridge=xenbr0’ ]

/etc/xen/services:

name = ‘services’
memory = 764
kernel = ‘/boot/vmlinuz-2.6-xen’
ramdisk = ‘/boot/initrd.img-2.6.18-xen’
extra = ‘root=/dev/sda1 ro’
disk = [‘phy:SERVICES_DOMU/SERVICES_ROOT,sda1,w’, ‘phy:SERVICES_DOMU/SERVICES_SWAP,sda2,w’, ‘phy:SERVICES_DOMU/SERVICES_HOME,sda3,w’]
vif = [ ‘mac=00:16:3e:3a:da:a1,bridge=xenbr0’ ]

Notem que a domU Firewall tem uma interface a mais que das fisicas. E todas as domUs (e dom0!) se comunicam pela bridge. Importante notar que é mais facil configurar na dom0, ip e rota na xenbr0, e nao diretamente na vif (Se seu firewall cair, vc perde acesso a domO, nesse caso, fica mais dificil, porque a bridge restabelece independente do ID da machine)

Assim, fica na domU Firewall:

eth0: Uma PCI
eth1: Outra PCI
eth2: Placa que interliga as domU e dom0

No meu caso, a eth0 ficou com o ip interno, a eth1, com o externo e a eth2 com um ip classe C só pra redinha interna (DMZ), sendo controlada pelo iptables no quesito NAT.

Para não ficar um porre de ler, dividir-ei em 2 partes. Nesta eu citei as particularidades do XEN em relação ao redirecionamento das placas, assunto muito obscuro na documentação do Xen; E na segunda parte, colocarei exemplos de firewall (no init do Debian!) e outras particularidades esquecidas.

Devo muuuuuuuuuuuuuuuuuuuuitissimo oferecer este artigo ao amigo SLot do #linux-bh, que me salvou uns bons pedaços de couro e ao lombra, sysadmin veio de guerra e que tem muito dedo nessa solução.

Anúncios

3 Comentários »

  1. Jóia essa dica!
    Espero eu mesmo colocá-la em prática em breve.

    Abraço,
    .

    Comentário por Andre Miguel — 26/12/2007 @ 13:28 | Responder

  2. Parabéns pelo artigo.

    Caso tenha interesse coloca ele no wiki.xen-br.org

    Abraços!

    Comentário por Elder Fernando — 23/03/2008 @ 17:55 | Responder

  3. Na verdade esqueci de anexar aqui. Vejam em: http://wiki.xen-br.org/index.php?title=Firewall_isolado_com_Xen_3.2

    Comentário por Leonardo Amaral — 23/03/2008 @ 19:25 | Responder


RSS feed for comments on this post. TrackBack URI

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Blog no WordPress.com.

%d blogueiros gostam disto: