O autor selecionou a Fundação Electronic Frontier para receber uma doação como parte do programa Write for DOnations.

Introdução

O OctoDNS é uma ferramenta de infraestrutura como código que permite que você implante e gerencie suas zonas de DNS usando princípios de desenvolvimento de software padrão, incluindo o controle, teste e implantação automatizada de versões. O OctoDNS foi criado pelo GitHub e está escrito em Python.

O OctoDNS elimina muitas das armadilhas do gerenciamento manual de DNS, já que os arquivos da zona ficam armazenados em um formato estruturado (YAML). Isso permite que você implante zonas para vários provedores de DNS simultaneamente, identifique erros de sintaxe e envie a configuração do DNS automaticamente, reduzindo o risco de erro humano. Outro uso comum do OctoDNS é o de sincronizar sua configuração do DNS entre diferentes provedores, como um sistema de teste e de produção, ou entre ambientes ativos e de failover.

O OctoDNS é parecido com o DNSControl, que é uma ferramenta equivalente criada pelo Stack Exchange e escrita em Go. Diferente do OctoDNS, o DNSControl utiliza uma linguagem de configuração baseada em JavaScript para definir as zonas de DNS, o que permite que você utilize recursos de programação avançados, tais como os loops para especificar vários registros semelhantes dentro da mesma zona. O artigo Como implantar e gerenciar seu DNS usando o DNSControl no Debian 10 aborda a instalação e configuração básicas do DNSControl.

Neste tutorial, você instalará e configurará o OctoDNS, criará uma configuração básica do DNS e começará a implantar os registros do DNS em um provedor ativo. Como parte deste tutorial, usaremos a DigitalOcean como a provedora de DNS do exemplo. Se quiser usar um provedor diferente, a configuração é bastante parecida. Quando tiver concluído a configuração, você conseguirá gerenciar e testar sua configuração de DNS em um ambiente seguro e off-line e, então, poderá implantá-lo na produção.

Pré-requisitos

Antes de iniciar este guia, será necessário o seguinte:

  • Um servidor Debian 10 configurado, de acordo com o artigo Configuração Inicial do servidor com o Debian 10, incluindo um usuário não raiz do comando sudo e um firewall habilitado para bloquear portas não essenciais. O your-server-ipv4-address e o your-server-ipv6-address referem-se ao endereço IP do servidor onde você estiver hospedando seu site ou domínio.
  • Um nome de domínio totalmente registrado com o DNS hospedado por um provedor compatível. Este tutorial usará o your-domain durante todo o processo e a DigitalOcean como a provedora de serviços.
  • Uma chave de API para a DigitalOcean (Token de acesso pessoal), com permissões de leitura e gravação. Para criar um chave, acesse a página do artigo sobre Como criar um Token de acesso pessoal.

Assim que estiver com tudo pronto, faça login no seu servidor como usuário não raiz para começar.

Passo 1 — Instalando o OctoDNS

O OctoDNS é distribuído como um pacote pip (sistema de gerenciamento de pacotes) em Python e funciona em um Ambiente Virtual Python (virtualenv). Dessa maneira, você iniciará este passo instalando os pacotes necessários para isso. Um virtualenv é um ambiente Python isolado que pode ter suas próprias bibliotecas e configuração, separado da instalação de Python do sistema principal. O Python e o virtualenv estão disponíveis dentro dos repositórios padrão de software do Debian, possibilitando que eles sejam instalados com as ferramentas convencionais de gerenciamento de pacotes.

Comece atualizando o índice de pacotes local para refletir quaisquer novas alterações feitas no pacote original:

  • sudo apt update

Então, instale os pacotes python e virtualenv:

  • sudo apt install python virtualenv

Após confirmar a instalação, a ferramenta apt irá baixar e instalar o Python, o virtualenv e todas as suas dependências necessárias.

Em seguida, você criará os diretórios necessários para o OctoDNS, onde sua configuração do DNS e do programa serão armazenados. Comece criando os diretórios ~/octodns e ~/octodns/config:

  • mkdir ~/octodns ~/octodns/config

Agora, vá para ~/octodns:

  • cd ~/octodns

Em seguida, você precisará criar o Ambiente Virtual em Python — um ambiente Python isolado com suas próprias bibliotecas e configuração no qual irá executar o OctoDNS:

  • virtualenv env

Ative seu ambiente com o seguinte comando:

  • source env/bin/activate

Isso irá gerar algo parecido com o seguinte:

Output
Running virtualenv with interpreter /usr/bin/python2 New python executable in /home/user/octodns/env/bin/python2 Also creating executable in /home/user/octodns/env/bin/python Installing setuptools, pkg_resources, pip, wheel...done.

Agora, seu prompt de shell no Bash também será prefixado com o nome do ambiente virtual. Isso mostra que você está operando dentro do virtualenv no momento:

(env) user@digitalocean:~/octodns$

Se quiser sair do virtualenv, utilize o comando deactivate a qualquer momento. No entanto, para continuar com este tutorial, você deve permanecer em seu virtualenv.

Agora que você instalou e configurou o Python e o virtualenv, instale o OctoDNS. O OctoDNS é distribuído como um pacote pip do Python, que é a ferramenta padrão de gerenciamento de pacotes para pacotes e bibliotecas do Python.

Você pode instalar o pacote pip do OctoDNS usando o seguinte comando dentro do seu virtualenv:

  • pip install octodns

Assim que terminar, verifique a versão instalada para garantir que tudo está funcionando:

  • octodns-sync --version

Sua saída será semelhante à seguinte:

Output
octoDNS 0.9.9

Caso veja um erro octodns-sync: command not found, verifique novamente se você ainda está dentro do seu virtualenv.

Agora que você instalou o OctoDNS, você pode criar os arquivos de configuração necessários para conectar o OctoDNS ao seu provedor de DNS para permitir que ele faça alterações nos seus registros de DNS.

Passo 2 — Configurando o OctoDNS

Neste passo, você criará os arquivos de configuração necessários para o OctoDNS e conectará ele ao seu provedor DNS, de modo que ele possa começar a fazer alterações em tempo real nos seus registros de DNS.

Nota: este tutorial se concentrará na configuração inicial do OctoDNS; no entanto, para o uso na produção, é recomendável armazenar sua configuração do OctoDNS em um sistema de controle de versão (VCS) como o Git. As vantagens de se usar um VCS incluem o controle total de versões, integração com CI/CD para teste, reverter implantações sem interrupções e assim por diante.

Primeiro, você precisa configurar o arquivo config.yaml, o qual define as zonas de DNS a serem gerenciadas pelo OctoDNS e permite que ele autentique seu provedor de DNS e faça alterações.

Dependendo do provedor de DNS que você estiver usando o formado do arquivo config.yaml será ligeiramente diferente. Para encontrar a configuração para o seu provedor, consulte a Lista de provedores compatíveis na documentação oficial do OctoDNS. Ao visualizar esse hiperlink, os detalhes da configuração serão apresentados como comentários de código no código Python em si, que está vinculado na coluna ‘Provedor’ da tabela. Assim que tiver encontrado o código Python para o seu provedor, como o cloudflare.py ou o route53.py, o comentário de código relevante poderá ser encontrado diretamente sob a class ProviderNameProvider. Por exemplo:

Excerpt of octodns/provider/route53.py
class Route53Provider(BaseProvider):
  '''
  AWS Route53 Provider
  route53:
      class: octodns.provider.route53.Route53Provider
      # The AWS access key id
      access_key_id:
      # The AWS secret access key
      secret_access_key:
      # The AWS session token (optional)
      # Only needed if using temporary security credentials
      session_token:

Vá para o diretório ~/octodns/config:

  • cd ~/octodns/config

Então, crie e abra o config.yaml para a edição:

  • nano config.yaml

Adicione a configuração de exemplo do arquivo config.yaml do seu provedor de DNS ao arquivo. Se estiver usando a DigitalOcean como sua provedora de DNS, você pode usar o seguinte:

~/octodns/config/config.yaml
---
providers:
  config:
    class: octodns.provider.yaml.YamlProvider
    directory: ./config
    default_ttl: 300
    enforce_order: True
  digitalocean:
    class: octodns.provider.digitalocean.DigitalOceanProvider
    token: your-digitalocean-oauth-token

zones:
  your-domain.:
    sources:
      - config
    targets:
      - digitalocean

Esse arquivo diz ao OctoDNS a quais provedores de DNS você quer que ele se conecte e quais zonas do DNS ele deve gerenciar em relação a esses provedores.

Você precisará fornecer alguma forma de autenticação para seu provedor de DNS. Normalmente, trata-se de uma chave de API ou de token do OAth.

Se não quiser armazenar seu token de acesso em texto simples no arquivo de configuração, em vez disso, você pode enviá-lo como uma variável de ambiente quando o programa for executado. Para fazer isso, você deve usar a seguinte linha de token: em vez de no arquivo config.yaml:

~/octodns/config/config.yaml
token: env/DIGITALOCEAN\_OAUTH\_TOKEN

Em seguida, antes de executar o OctoDNS, defina a variável de ambiente relevante para o seu token de acesso e o OctoDNS o lerá a partir daí quando for executado:

  • export DIGITALOCEAN\_OAUTH\_TOKEN=your-digitalocean-oauth-token

Aviso: este token dará acesso à sua conta do provedor de DNS; portanto, você deve protegê-lo, assim como faria com uma senha. Além disso, se você estiver usando um sistema de controle de versão, certifique-se de que o arquivo que contém o token seja excluído (por exemplo, usando o .gitignore) ou criptografado de maneira segura.

Se estiver usando a DigitalOcean como sua provedora de DNS, você pode usar o token do OAuth necessário - gerado como parte dos pré-requisitos - em suas configurações de conta da DigitalOcean.

Se você tiver vários provedores de DNS — por exemplo, para vários nomes de domínios, ou zonas de DNS delegadas — você pode definir todos eles no mesmo arquivo config.yaml.

Você configurou o arquivo de configuração inicial do OctoDNS para permitir que o programa autentique o seu provedor de DNS e faça alterações. Em seguida, você criará a configuração para suas zonas de DNS.

Passo 3 — Criando um arquivo de configuração de DNS

Neste passo, você criará um arquivo de configuração inicial do DNS, que terá os registros de DNS para seu nome de domínio ou zona de DNS delegada.

Cada zona de DNS que você quiser gerenciar usando o OctoDNS tem seu próprio arquivo, por exemplo your-domain.yaml​​​​. Nesse arquivo, os registros de DNS para a zona são definidos com o YAML.

Para começar, vá para o diretório ~/octodns/config:

  • cd ~/octodns/config

Então, crie e abra o your-domain.yaml para a edição:

  • nano your-domain.yaml

Adicione a seguinte configuração de exemplo ao arquivo:

~/octodns/config/your-domain.yaml
---
'':
  - type: A
    value: your-server-ipv4-address

www:
  - type: A
    value: your-server-ipv4-address

Esse arquivo de exemplo define uma zona de DNS para o your-domain com dois registros do tipo A, apontando para o endereço IPv4 em que você está hospedando seu domínio ou site. Um registro do tipo A é para o domínio raiz (por exemplo, your-domain) e o outro registro A é para o subdomínio www (por exemplo, www.your-domain).

Assim que terminar, salve e feche o arquivo.

Você configurou um arquivo básico de configuração de zona de DNS para o OctoDNS, com dois registros tipo A básicos apontando para o endereço IPv4 do seu domínio ou site. Em seguida, você irá expandir arquivo com alguns registros úteis de DNS.

Passo 4 — Preenchendo seu arquivo de configuração de DNS

Em seguida, você pode preencher o arquivo de configuração do DNS com um conjunto prático de registros de DNS para o seu site ou serviço, usando a linguagem de configuração estruturada YAML.

Diferente dos arquivos da zona BIND tradicionais, onde os registros DNS estão escritos em um formato bruto, linha a linha, os registros de DNS dentro do OctoDNS são definidos como chaves e subchaves em YAML, com um número de valores associados, como mostrado rapidamente no Passo 3.

Normalmente, a chave de nível superior é a 'name', que é essencialmente, o identificador do registro. www, subdomain1 e mail são todos exemplos do DNS 'name'. No OctoDNS, existem dois nomes para uso especial, que são '', para o registro raiz (geralmente referido como @) e '*', para registros curinga. O type é um valor necessário de cada chave (registro de DNS). Isso define qual tipo de registro de DNS você está definindo dentro daquela chave de nível superior em YAML. Existe um type para cada um dos tipos padrão de registro de DNS, incluindo A, AAAA, MX, TXT, NS, CNAME e assim por diante. Na seção de Registros da documentação do OctoDNS, você encontra uma lista completa dos tipos de registro disponíveis.

Os valores dos seus registros de DNS são definidos diretamente - como valores para as chaves de nível superior (se tiver apenas um valor), ou como uma lista (se tiver vários valores como, por exemplo, múltiplos endereços IP ou MX).

Por exemplo, para definir um único valor, você poderia usar a seguinte configuração:

~/octodns/config/your-domain.yaml
'www':
  type: A
  value: 203.0.113.1

Como alternativa, para definir vários valores para um único registro:

~/octodns/config/your-domain.yaml
'www':
  type: A
  values:
  - 203.0.113.1
  - 203.0.113.2

A sintaxe para definir registros de DNS varia ligeiramente para cada tipo de registro. Em seguida, temos alguns exemplos dos tipos de registro mais comuns:

Registros do tipo A:

Objetivo: apontar para um endereço IPv4.

Sintaxe:

'name':
  type: A
  value: ipv4-address

Exemplo:

'www':
  type: A
  value: your-server-ipv4-address

Registros do tipo AAAA:

Objetivo: apontar para um endereço IPv6.

Sintaxe:

'name':
  type: AAAA
  value: ipv6-address

Exemplo:

'www':
  type: AAAA
  value: your-server-ipv6-address

Registros do tipo CNAME:

Objetivo: transformar o seu domínio/subdomínio em alias de outro.

Sintaxe:

'name':
  type: CNAME
  value: fully-qualified-domain-name

Exemplo:

'www':
  type: CNAME
  value: www.example.org

Registros do tipo MX:

Objetivo: direcionar e-mails para servidores/endereços específicos.

Sintaxe:

'name':
  type: MX
  value:
    exchange: mail-server
    preference: priority-value

Note que um ponto final, ., *deve *ser incluído se houver quaisquer pontos no valor do registro tipo MX.

Exemplo:

'':
  type: MX
  value:
    exchange: mail.your-domain.
    preference: 10

Registros do tipo TXT:

Objetivo: adicionar texto simples arbitrário, frequentemente usado para configurações sem seu próprio tipo de registro dedicado.

Sintaxe:

'name':
  type: TXT
  value: content

Exemplo:

'':
  type: TXT
  value: This is a TXT record.

Para começar a adicionar registros de DNS ao seu domínio ou zona de DNS delegada, edite seu arquivo de configuração de DNS:

  • cd ~/octodns/config
  • nano your-domain.yaml

Na sequência, você pode começar a preencher sua zona de DNS, usando a sintaxe descrita na lista anterior, bem como a seção de Registros da documentação oficial do OctoDNS.

A título de referência, este bloco de código contém um exemplo da configuração completa de uma definição básica, inicial do DNS:

~/octodns/config/your-domain.yaml
---
'':
  - type: A
    value: your-server-ipv4-address

  - type: AAAA
    value: your-server-ipv6-address

  - type: MX
    value:
      exchange: mail.your-domain.
      preference: 10

  - type: TXT
    value: v=spf1 -all

_dmarc:
  type: TXT
  value: v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;

mail:
  - type: A
    value: your-server-ipv4-address

  - type: AAAA
    value: your-server-ipv6-address

www:
  - type: A
    value: your-server-ipv4-address

  - type: AAAA
    value: your-server-ipv6-address

Assim que tiver completado sua configuração inicial de DNS, salve e feche o arquivo.

Neste passo, você configurou o arquivo de configuração inicial do DNS, contendo seus registros de DNS. Em seguida, você testará a configuração e a implantará.

Passo 5 — Testando e implantando sua configuração de DNS

Neste passo, você executará uma verificação local da sintaxe em sua configuração de DNS e, em seguida, implantará as alterações no servidor/provedor ativo de DNS.

Primeiro, vá até seu diretório octodns:

  • cd ~/octodns

Verifique novamente se você ainda está operando dentro do seu virtualenv em Python, procurando por seu nome, antes do prompt do Bash:

(env) user@digitalocean:~/octodns$

Em seguida, utilize o comando octodns-validate para verificar a sintaxe do(s) seu(s) arquivo(s) de configuração. Você precisará especificar o caminho para seu arquivo de configuração:

  • octodns-validate --config=./config/config.yaml

Se a sintaxe YAML do seu arquivo de configuração DNS estiver correta, o OctoDNS não retornará nenhum resultado. Se ver um erro ou um aviso em seu resultado, o OctoDNS dará detalhes sobre o que está errado e onde o erro está localizado dentro do seu arquivo YAML.

Em seguida, você pode realizar um push de simulação da configuração do DNS, que irá exibir quais alterações serão feitas, sem, de fato, fazê-las:

  • octodns-sync --config=./config/config.yaml

Isso deve gerar uma saída parecida com esta:

Output
******************************************************************************** * your-domain. ******************************************************************************** * digitalocean (DigitalOceanProvider) * Create <ARecord A 300, mail.your-domain., ['your-server-ipv4-address']> (config) * Create <AaaaRecord AAAA 300, mail.your-domain., ['your-server-ipv6-address']> (config) * Create <TxtRecord TXT 300, your-domain., ['v=spf1 -all']> (config) * Create <AaaaRecord AAAA 300, your-domain., ['your-server-ipv6-address']> (config) * Create <ARecord A 300, your-domain., ['your-server-ipv4-address']> (config) * Create <ARecord A 300, www.your-domain., ['your-server-ipv4-address']> (config) * Create <MxRecord MX 300, your-domain., [''10 mail.your-domain.'']> (config) * Create <TxtRecord TXT 300, _dmarc.your-domain., ['v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;']> (config) * Create <AaaaRecord AAAA 300, www.your-domain., ['your-server-ipv6-address']> (config) * Summary: Creates=9, Updates=0, Deletes=0, Existing Records=2 ********************************************************************************

Aviso: o próximo comando fará alterações em tempo real nos seus registros de DNS e, possivelmente, em outras configurações. Certifique-se de que esteja preparado para isso, incluindo a realização de um backup da sua configuração de DNS existente, além de garantir que tenha os meios para reverter o processo, se necessário.

Por fim, você pode enviar as alterações para seu provedor de DNS ativo:

  • octodns-sync --config=./config/config.yaml --doit

Nota: em alguns casos, o OctoDNS se recusará a forçar alterações se estiver fazendo um número significativo de ajustes. Trata-se de um recurso de proteção automático feito para evitar erros de configuração acidentais. Se ocorrer essa recusa, tente executar novamente o octodns-sync usando a opção --force, mas certifique-se de que esteja pronto para fazer isso.

Neste passo, você verá uma saída similar à simulação anterior, mas com a adição de algo parecido com o seguinte:

Output
2019-07-07T23:17:27 INFO DigitalOceanProvider[digitalocean] apply: making changes 2019-07-07T23:17:30 INFO Manager sync: 9 total changes

Agora, se verificar as configurações de DNS do seu domínio no painel de controle da DigitalOcean, verá as alterações.

Captura de tela do painel de controle da DigitalOcean, que mostra algumas alterações do DNS, feitas pelo OctoDNS.

Também é possível verificar a criação de registros, executando uma consulta de DNS em relação à sua zona de domínio/delegada usando o dig.

Se não tiver o dig instalado, será necessário instalar o pacote dnsutils:

  • sudo apt install dnsutils

Assim que instalar o dig, utilize-o para fazer uma pesquisa de DNS em relação ao seu domínio. Você verá que os registros foram devidamente atualizados:

  • dig +short your-domain

Você verá uma saída que mostra o endereço IP e o registro relevante de DNS da sua zona - que foi implantado usando o OctoDNS. Os registros de DNS podem levar algum tempo para se propagarem; assim, talvez seja necessário esperar e executar esse comando novamente.

Neste passo final, você executou uma verificação da sintaxe local do arquivo de configuração do DNS. Em seguida, implantou-a em seu provedor de DNS ativo e testou se as alterações foram feitas com êxito.

Conclusão

Neste artigo, você configurou o OctoDNS e implantou uma configuração de DNS em um provedor ativo. Agora, você pode gerenciar e testar suas alterações de configuração do DNS em um ambiente seguro e off-line, antes de implantá-las na produção.

Se quiser explorar mais esse assunto, o OctoDNS foi criado para se integrar ao seu pipeline de CI/CD (Integração Contínua/Entrega Contínua), o que lhe permite executar testes em profundidade e ter mais controle sobre sua implantação na produção. Você também pode pesquisar sobre a integração do OctoDNS aos seus processos de compilação/implantação de infraestrutura, o que permite implantar servidores e adicioná-los ao DNS de maneira completamente automática.

Se quiser saber mais sobre o OctoDNS, os artigos da DigitalOcean a seguir fornecem alguns passos interessantes para ajudar a integrar o OctoDNS em seus fluxos de trabalho de gerenciamento de mudanças e implantação de infraestrutura:

0 Comments

Creative Commons License