Terraform — Gerenciando DNS com TSIG

Terraform — Gerenciando DNS com TSIG

Terraform é uma ferramenta da Hashicorp focada em Bootstrapping e inicialização de recursos. Em comparação com Puppet , este é responsável por gerenciar a configuração de uma infraestrutura existente, já o Terraform criará essa infraestrutura que será gerenciada pelo Puppet.

Nesse post, vou mostrar como gerenciar entradas de DNS através do Terraform usando o protocolo TSIG ( Transaction Signature ). O protocolo é documentando na RFC 2845 ( https://tools.ietf.org/html/rfc2845 ), nos permitindo fazer atualizações dinâmicas no servidor de DNS, de forma segura sem precisar logar no servidor.

Agora Hands On!

O primeiro passo, subir uma máquina no Vagrant com o bind9 instalado:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
  end
  
  config.vm.define "bind9" do |node| 
    node.vm.box = "ubuntu/trusty64"
    node.vm.hostname = "dns-terraform"
    node.vm.network "public_network", bridge: "wlp4s0"
    node.vm.provision "shell", inline: <<-SHELL
      apt-get clean all
      apt-get update
      apt-get install -y bind9 dnsutils
    SHELL
  end

end

Esse Vagrantfile subirá um servidor Ubuntu 16.04, já com o bind9 instalado. Bind9 é o servidor de DNS geralmente utilizado nos servidores Linux.

Após a inicialização da máquina, acesse o diretório /etc/bind:

$ vagrant ssh bind9
vagrant@dns-terraform:~$ sudo su -
root@dns-terraform:~# cd /etc/bind/

Veja os arquivos no diretório:

root@dns-terraform:/etc/bind# ls
bind.keys  db.127  db.empty  db.root     named.conf.default-zones  named.conf.options  zones.rfc1918
db.0       db.255  db.local  named.conf  named.conf.local          rndc.key

Quando instalado, o bind9 automaticamente cria uma chave chamada rndc.key, vamos ver o seu conteúdo:

root@dns-terraform:/etc/bind# cat rndc.key 
key "rndc-key" {
	algorithm hmac-md5;
	secret "oP+1ph0UYnWnL/D8QXNYSQ==";
};

Copie esse conteúdo e cole dentro de /etc/bind/named.conf.local.

root@dns-terraform:/etc/bind# cat named.conf.local 
//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";


key "rndc-key" {
	algorithm hmac-md5;
	secret "oP+1ph0UYnWnL/D8QXNYSQ==";
};

Nesse passo, criamos uma chave chamada rndc-key que usaremos em breve.

Agora, precisamos criar uma zona de DNS:

root@dns-terraform:/etc/bind# cp /etc/bind/db.local /var/cache/bind/db.alissonmachado.com.br

Substitua o conteúdo localhost por alissonmachado.com.br:

root@dns-terraform:/etc/bind# sed -i "s/localhost/alissonmachado.com.br/g" /var/cache/bind/db.alissonmachado.com.br

A zona de DNS deve ficar da seguinte forma:

root@dns-terraform:/etc/bind# cat /var/cache/bind/db.alissonmachado.com.br
;
; BIND data file for local loopback interface
;
$TTL	604800
@	IN	SOA	alissonmachado.com.br. root.alissonmachado.com.br. (
			      2		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	alissonmachado.com.br.
@	IN	A	127.0.0.1
@	IN	AAAA	::1

Vamos editar novamente o named.conf.local, ficará da seguinte forma:

root@dns-terraform:/etc/bind# cat /etc/bind/named.conf.local 
//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";


key "rndc-key" {
	algorithm hmac-md5;
	secret "oP+1ph0UYnWnL/D8QXNYSQ==";
};


zone "alissonmachado.com.br." {
	type master;
	file "/var/cache/bind/db.alissonmachado.com.br";
        allow-update { key rndc-key; };
};

Reinicie o bind.

root@dns-terraform:/etc/bind# service bind9 restart
 * Stopping domain name service... bind9                                                                                                  waiting for pid 3291 to die
                                                                                                                                   [ OK ]
 * Starting domain name service... bind9                                                                                           [ OK ] 
root@dns-terraform:/etc/bind# 

Para validar se o DNS está funcionando, utilize o comando host:

root@dns-terraform:/etc/bind# host alissonmachado.com.br localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases: 

alissonmachado.com.br has address 127.0.0.1

Está Ok!

Seguimos para o Terraform.

Para instalar o Terraform, basta fazer o download do zip da documentação oficial.

https://www.terraform.io/downloads.html

Crie um arquivo chamado alisson_dns.tf com o seguinte conteúdo:

provider "dns" {
  update {
    server        = "10.100.0.171"
    key_name      = "rndc-key."
    key_algorithm = "hmac-md5"
    key_secret    = "oP+1ph0UYnWnL/D8QXNYSQ=="
  }
}

resource "dns_a_record_set" "teste" {
  zone = "alissonmachado.com.br."
  name = "hector"
  addresses = [
    "6.6.6.6"
  ]
  ttl = 300
}

resource "dns_a_record_set" "jorge" {
  zone = "alissonmachado.com.br."
  name = "jorge"
  addresses = [
    "10.10.10.10"
  ]
  ttl = 300
}

Arquivo criado, deixe o log do dns na tela, para acompanhar a modificação:

root@dns-terraform:/etc/bind# tail -f /var/log/syslog 

Dentro do Terraform, utilizamos o provider DNS. Deve ser baixado antes de executar o Terraform, para isso, na pasta onde vc criou o alisson_dns.tf, digite o comando terraform init:

$ terraform init

Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "dns" (1.0.0)...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.dns: version = "~> 1.0"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If y

O provider foi instalado.

Digite o comando terraform plan. O mesmo mostrará o que será alterado no seu dns.

$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + dns_a_record_set.jorge
      id:                   
      addresses.#:          "1"
      addresses.3258735021: "10.10.10.10"
      name:                 "jorge"
      ttl:                  "300"
      zone:                 "alissonmachado.com.br."

  + dns_a_record_set.teste
      id:                   
      addresses.#:          "1"
      addresses.3786324972: "6.6.6.6"
      name:                 "hector"
      ttl:                  "300"
      zone:                 "alissonmachado.com.br."


Plan: 2 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------
a chamada 
Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

Veja que serão criadas duas entradas de dns, uma chamada jorge, apontando para o ip 10.10.10.10, a outra chamada hector, apontando para o ip 6.6.6.6.

Digite o comando terraform apply:

$ terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + dns_a_record_set.jorge
      id:                   
      addresses.#:          "1"
      addresses.3258735021: "10.10.10.10"
      name:                 "jorge"
      ttl:                  "300"
      zone:                 "alissonmachado.com.br."

  + dns_a_record_set.teste
      id:                   
      addresses.#:          "1"
      addresses.3786324972: "6.6.6.6"
      name:                 "hector"
      ttl:                  "300"
      zone:                 "alissonmachado.com.br."


Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

dns_a_record_set.teste: Creating...
  addresses.#:          "" => "1"
  addresses.3786324972: "" => "6.6.6.6"
  name:                 "" => "hector"
  ttl:                  "" => "300"
  zone:                 "" => "alissonmachado.com.br."
dns_a_record_set.jorge: Creating...
  addresses.#:          "" => "1"
  addresses.3258735021: "" => "10.10.10.10"
  name:                 "" => "jorge"
  ttl:                  "" => "300"
  zone:                 "" => "alissonmachado.com.br."
dns_a_record_set.jorge: Creation complete after 0s (ID: jorge.alissonmachado.com.br.)
dns_a_record_set.teste: Creation complete after 0s (ID: hector.alissonmachado.com.br.)

Observe que no final da execução do comando, apareceu a mensagem Creation complete.

No log do bind apareceu a seguinte mensagem:

root@dns-terraform:/etc/bind# tail -f /var/log/syslog 
Apr 30 18:51:54 vagrant-ubuntu-trusty-64 named[3608]: client 10.100.0.185#53063/key rndc-key: updating zone 'alissonmachado.com.br/IN': adding an RR at 'jorge.alissonmachado.com.br' A
Apr 30 18:51:54 vagrant-ubuntu-trusty-64 named[3608]: client 10.100.0.185#47174/key rndc-key: signer "rndc-key" approved
Apr 30 18:51:54 vagrant-ubuntu-trusty-64 named[3608]: client 10.100.0.185#47174/key rndc-key: updating zone 'alissonmachado.com.br/IN': adding an RR at 'hector.alissonmachado.com.br' A

Neste momento, se eu fizer uma consulta de DNS, obterei retorno dos IPs cadastrados no terraform.

root@dns-terraform:/etc/bind# host jorge.alissonmachado.com.br localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases: 

jorge.alissonmachado.com.br has address 10.10.10.10
root@dns-terraform:/etc/bind# host hector.alissonmachado.com.br localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases: 

hector.alissonmachado.com.br has address 6.6.6.6

Dahora… é isso ae, valeuz!

alissonmachado.com.br

Anterior Minishift — Openshift Origin como ambiente de desenvolvimento
Próxima 4Linux no FISL Porto Alegre!

About author

Alisson Machado
Alisson Machado 16 posts

Alisson Menezes, atua como Gerente de T.I, 9 anos de experiência em projetos FOSS (Free and Open Source Software) e Python. Formação em Análise de Sistemas pela FMU e cursando MBA em BigData pela FIA, possui certificações LPI1, LPI2 e SUSE CLA, LPI DevOps e Exim - DevOps Professional. Autor dos cursos Python Fundamentals, Python for Sysadmins, MongoDB for Developers/DBAs, DevSecOps, Co-Autor do Infraestrutura Ágil e Docker da 4Linux e palestrantes em eventos como FISL, TDC e Python Brasil. É entusiasta das mais diversas áreas em T.I como Segurança, Bancos de dados NoSQL, DataScience mas tem como foco DevOps e Automação.

View all posts by this author →

Você pode gostar também

Infraestrutura

Graylog – Gerenciando todos os seus Logs

Este post tem como objetivo apresentar um guia para instalação e configuração do Graylog em Debian 8 (Jessie), suportado pelos bancos de dados noSQL  MongoDB e ElasticSearch e com alta

DevOps

Rundeck, bom para projetos DevOps

O Rundeck é uma aplicação java de código aberto que automatiza processos e rotinas nos mais variados ambientes, gerenciado via interface gráfica fica extremamente simples de verificar status de execuções,

Treinamentos

4Linux lança curso de DevSecOps e solidifica liderança em cursos para carreira DevOps

Treinamento possui conteúdo único em relação a qualquer outro no mercado A 4Linux anuncia hoje o lançamento de mais um curso para enriquecer a sua oferta de treinamentos na carreira