著者は、 Electronic Frontier Foundation Inc を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

DNSControlinfrastructure-as-codeツールであり、バージョン管理、テスト、自動展開などの標準的なソフトウェア開発原則を使用してDNSゾーンを展開および管理できます。 DNSControlはStackExchangeによって作成され、Goで記述されています。

DNSControlを使用すると、ゾーンファイルがプログラム可能な形式で保存されるため、手動のDNS管理の落とし穴の多くが解消されます。 これにより、ゾーンを複数のDNSプロバイダーに同時に展開し、構文エラーを識別し、DNS構成を自動的にプッシュして、人的エラーのリスクを減らすことができます。 DNSControlのもう1つの一般的な使用法は、DNSを別のプロバイダーにすばやく移行することです。 たとえば、DDoS攻撃やシステム停止が発生した場合です。

このチュートリアルでは、DNSControlをインストールして構成し、基本的なDNS構成を作成して、ライブプロバイダーへのDNSレコードの展開を開始します。 このチュートリアルの一部として、DNSプロバイダーの例としてDigitalOceanを使用します。 別のプロバイダーを使用する場合、セットアップは非常に似ています。 終了すると、安全なオフライン環境でDNS構成を管理およびテストし、それを本番環境に自動的に展開できるようになります。

前提条件

このガイドを開始する前に、次のものが必要です。

  • Ubuntu 18.04を使用した初期サーバーセットアップに従ってセットアップされた1つのUbuntu18.04サーバー。これには、sudo非rootユーザーと、非必須ポートをブロックするファイアウォールが含まれます。 your-server-ipv4-addressは、ウェブサイトまたはドメインをホストしているサーバーのIPアドレスを指します。
  • がサポートするプロバイダーによってホストされているDNSに完全に登録されたドメイン名。 このチュートリアルでは、全体でexample.comを使用し、サービスプロバイダーとしてDigitalOceanを使用します。
  • 読み取りおよび書き込み権限を持つDigitalOceanAPIキー(パーソナルアクセストークン)。 作成するには、パーソナルアクセストークンの作成方法にアクセスしてください。

これらの準備ができたら、root以外のユーザーとしてサーバーにログインして開始します。

ステップ1—DNSControlをインストールする

DNSControlはGoで記述されているため、サーバーにGoをインストールし、GOPATHを設定することからこの手順を開始します。

GoはUbuntuのデフォルトのソフトウェアリポジトリ内で利用可能であり、従来のパッケージ管理ツールを使用してインストールすることができます。

ローカルパッケージインデックスを更新して、新しいアップストリームの変更を反映することから始めます。

  1. sudo apt update

次に、golang-goパッケージをインストールします。

  1. sudo apt install golang-go

インストールを確認した後、aptはGoとそれに必要なすべての依存関係をダウンロードしてインストールします。

次に、Goに必要なパス環境変数を構成します。 これについて詳しく知りたい場合は、GOPATHの理解でこのチュートリアルを読むことができます。 ~/.profileファイルを編集することから始めます。

  1. nano ~/.profile

ファイルの最後に次の行を追加します。

〜/ .profile
...
export GOPATH="$HOME/go"
export PATH="$PATH:$GOPATH/bin"

これらの行をファイルの最後に追加したら、保存して閉じます。 次に、ログアウトして再度ログインするか、ファイルを再度ソースして、プロファイルをリロードします。

  1. source ~/.profile

Goをインストールして構成したので、DNSControlをインストールできます。

go getコマンドを使用して、コードのコピーをフェッチし、自動的にコンパイルしてGoディレクトリにインストールできます。

  1. go get github.com/StackExchange/dnscontrol

これが完了したら、インストールされているバージョンをチェックして、すべてが機能していることを確認できます。

  1. dnscontrol version

出力は次のようになります。

Output
dnscontrol 0.2.8-dev

dnscontrol: command not foundエラーが表示された場合は、Goパスの設定を再確認してください。

DNSControlをインストールしたので、構成ディレクトリを作成し、DNSControlをDNSプロバイダーに接続して、DNSレコードを変更できるようにすることができます。

ステップ2—DNSControlの構成

このステップでは、DNSControlに必要な構成ディレクトリを作成し、DNSプロバイダーに接続して、DNSレコードにライブ変更を加え始めることができるようにします。

まず、DNSControl構成を保存できる新しいディレクトリを作成してから、そのディレクトリに移動します。

  1. mkdir ~/dnscontrol
  2. cd ~/dnscontrol

注:このチュートリアルでは、DNSControlの初期設定に焦点を当てます。 ただし、本番環境で使用する場合は、DNSControl構成を Git などのバージョン管理システム(VCS)に保存することをお勧めします。 これの利点には、完全なバージョン管理、テストのためのCI / CDとの統合、シームレスなロールバック展開などが含まれます。

DNSControlを使用してBINDゾーンファイルを書き込む場合は、zonesディレクトリも作成する必要があります。

  1. mkdir ~/dnscontrol/zones

BINDゾーンファイルは、DNSゾーン/レコードをプレーンテキスト形式で保存するための生の標準化された方法です。 もともとはBINDDNSサーバーソフトウェアに使用されていましたが、現在ではDNSゾーンを保存するための標準的な方法として広く採用されています。 DNSControlによって生成されたBINDゾーンファイルは、カスタムまたはセルフホストのDNSサーバーにインポートする場合、または監査目的で役立ちます。

ただし、DNSControlを使用してDNSの変更を管理対象プロバイダーにプッシュするだけの場合は、zonesディレクトリは必要ありません。

次に、creds.jsonファイルを構成する必要があります。これにより、DNSControlがDNSプロバイダーに対して認証を行い、変更を加えることができます。 creds.jsonの形式は、使用しているDNSプロバイダーによって若干異なります。 独自のプロバイダーの構成を見つけるには、公式DNSControlドキュメントのサービスプロバイダーリストを参照してください。

~/dnscontrolディレクトリにファイルcreds.jsonを作成します。

  1. cd ~/dnscontrol
  2. nano creds.json

DNSプロバイダーのサンプルcreds.json構成をファイルに追加します。 DNSプロバイダーとしてDigitalOceanを使用している場合は、次を使用できます。

〜/ dnscontrol / creds.json
{
  "digitalocean": {
    "token": "your-digitalocean-oauth-token"
  }
}

このファイルは、DNSControlに接続するDNSプロバイダーを通知します。

DNSプロバイダーに何らかの形式の認証を提供する必要があります。 これは通常、APIキーまたはOAuthトークンですが、公式のDNSControlドキュメントのサービスプロバイダーリストに記載されているように、一部のプロバイダーは追加情報を必要とします。

警告:このトークンはDNSプロバイダーアカウントへのアクセスを許可するため、パスワードと同じように保護する必要があります。 また、バージョン管理システムを使用している場合は、トークンを含むファイルが除外されていることを確認してください(例: .gitignore)を使用するか、何らかの方法で安全に暗号化されます。

DNSプロバイダーとしてDigitalOceanを使用している場合は、前提条件の一部として生成したDigitalOceanアカウント設定で必要なOAuthトークンを使用できます。

複数の異なるDNSプロバイダーがある場合(たとえば、複数のドメイン名や委任されたDNSゾーンの場合)、これらすべてを同じcreds.jsonファイルで定義できます。

DNSControlの初期構成ディレクトリを設定し、creds.jsonを構成して、DNSControlがDNSプロバイダーに対して認証を行い、変更を加えることができるようにしました。 次に、DNSゾーンの構成を作成します。

ステップ3—DNS構成ファイルを作成する

このステップでは、ドメイン名または委任されたDNSゾーンのDNSレコードを含む初期DNS構成ファイルを作成します。

dnsconfig.jsは、DNSControlのメインDNS構成ファイルです。 このファイルでは、DNSゾーンとそれに対応するレコードがJavaScript構文を使用して定義されています。 これはDSLまたはドメイン固有言語として知られています。 DNSControlの公式ドキュメントのJavaScriptDSL ページに、詳細が記載されています。

まず、~/dnscontrolディレクトリにDNS構成ファイルを作成します。

  1. cd ~/dnscontrol
  2. nano dnsconfig.js

次に、次のサンプル構成をファイルに追加します。

〜/ dnscontrol / dnsconfig.js
// Providers:

var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_DIGITALOCEAN = NewDnsProvider('digitalocean', 'DIGITALOCEAN');

// Domains:

D('example.com', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
    A('@', 'your-server-ipv4-address')
);

このサンプルファイルは、特定のプロバイダー(この場合はDigitalOceanによってホストされるexample.com)のドメイン名またはDNSゾーンを定義します。 Aレコードの例もゾーンルート(@)に対して定義されており、ドメイン/ウェブサイトをホストしているサーバーのIPv4アドレスを指しています。

基本的なDNSControl構成ファイルを構成する3つの主要な機能があります。

  • NewRegistrar(name, type, metadata):ドメイン名のドメインレジストラを定義します。 DNSControlはこれを使用して、権限のあるネームサーバーの変更など、必要な変更を加えることができます。 DNSControlを使用してDNSゾーンを管理するだけの場合は、通常、NONEのままにしておくことができます。

  • NewDnsProvider(name, type, metadata):ドメイン名または委任されたゾーンのDNSサービスプロバイダーを定義します。 これは、DNSControlがユーザーが行ったDNS変更をプッシュする場所です。

  • D(name, registrar, modifiers):DNSControlが管理するドメイン名または委任されたDNSゾーン、およびゾーンに存在するDNSレコードを定義します。

公式のDNSControlドキュメントのサービスプロバイダーリストを使用して、それに応じてNewRegistrar()NewDnsProvider()、およびD()を構成する必要があります。

DNSプロバイダーとしてDigitalOceanを使用していて、(権威のあるネームサーバーではなく)DNSを変更するだけでよい場合は、前のコードブロックのサンプルはすでに正しいです。

完了したら、ファイルを保存して閉じます。

この手順では、関連するプロバイダーを定義して、DNSControlのDNS構成ファイルを設定します。 次に、いくつかの有用なDNSレコードをファイルに入力します。

ステップ4—DNS構成ファイルにデータを入力する

次に、DNSControl構文を使用して、DNS構成ファイルにWebサイトまたはサービスに役立つDNSレコードを入力できます。

DNSレコードが生の行ごとの形式で書き込まれる従来のBINDゾーンファイルとは異なり、DNSControl内のDNSレコードは、D()関数の関数パラメーター(ドメイン修飾子)として定義されます。ステップ3。

ドメイン修飾子は、AAAAAMXTXTNS、[ X133X]など。 使用可能なレコードタイプの完全なリストは、DNSControlドキュメントの DomainModifiersセクションにあります。

個々のレコードの修飾子も使用できます(レコード修飾子)。 現在、これらは主に個々のレコードのTTL(存続時間)を設定するために使用されます。 使用可能なレコード修飾子の完全なリストは、DNSControlドキュメントのレコード修飾子セクションにあります。 レコード修飾子はオプションであり、ほとんどの基本的なユースケースでは省略できます。

DNSレコードを設定するための構文は、レコードタイプごとにわずかに異なります。 以下は、最も一般的なレコードタイプの例です。

  • Aレコード:

    • 目的:IPv4アドレスを指すこと。
    • 構文:A('name', 'address', optional record modifiers)
    • 例:A('@', 'your-server-ipv4-address', TTL(30))
  • AAAAレコード:

    • 目的:IPv6アドレスを指すこと。
    • 構文:AAAA('name', 'address', optional record modifiers)
    • 例:AAAA('@', 'your-server-ipv6-address')(レコード修飾子が省略されているため、デフォルトのTTLが使用されます)
  • CNAMEレコード:

    • 目的:ドメイン/サブドメインを別のエイリアスにすること。
    • 構文:CNAME('name', 'target', optional record modifiers)
    • 例:CNAME('subdomain1', 'example.org.')(値にドットがある場合は、末尾の. を含める必要があることに注意してください)
  • MXレコード:

    • 目的:特定のサーバー/アドレスに電子メールを送信します。
    • 構文:MX('name', 'priority', 'target', optional record modifiers)
    • 例:MX('@', 10, 'mail.example.net')(値にドットがある場合は、末尾の. を含める必要があることに注意してください)
  • TXTレコード:

    • 目的:任意のプレーンテキストを追加します。多くの場合、専用のレコードタイプのない構成に使用されます。
    • 構文:TXT('name', 'content', optional record modifiers)
    • 例:TXT('@', 'This is a TXT record.')
  • CAAレコード:

    • 目的:ドメイン/サブドメインのTLS証明書を発行できる認証局(CA)を制限し、報告します。
    • 構文:CAA('name', 'tag', 'value', optional record modifiers)
    • 例:CAA('@', 'issue', 'letsencrypt.org')

ドメインまたは委任されたDNSゾーンのDNSレコードの追加を開始するには、DNS構成ファイルを編集します。

  1. cd ~/dnscontrol
  2. nano dnsconfig.js

次に、前のリストで説明した構文と、DNSControlの公式ドキュメントの Domain Modifiers セクションを使用して、既存のD()関数のパラメーターの入力を開始できます。 各レコードの間にコンマ(,)を使用する必要があります。

参考までに、ここのコードブロックには、基本的な初期DNSセットアップの完全なサンプル構成が含まれています。

〜/ dnscontrol / dnsconfig.js
...

D('example.com', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
    A('@', 'your-server-ipv4-address'),
    A('www', 'your-server-ipv4-address'),
    A('mail', 'your-server-ipv4-address'),
    AAAA('@', 'your-server-ipv6-address'),
    AAAA('www', 'your-server-ipv6-address'),
    AAAA('mail', 'your-server-ipv6-address'),
    MX('@', 10, 'mail.example.com.'),
    TXT('@', 'v=spf1 -all'),
    TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:[email protected]; aspf=s; adkim=s;')
);

DNSの初期構成が完了したら、ファイルを保存して閉じます。

この手順では、DNSレコードを含む初期DNS構成ファイルを設定します。 次に、構成をテストしてデプロイします。

ステップ5—DNS構成のテストと展開

このステップでは、DNS構成に対してローカル構文チェックを実行してから、変更をライブDNSサーバー/プロバイダーに展開します。

まず、dnscontrolディレクトリに移動します。

  1. cd ~/dnscontrol

次に、DNSControlのpreview関数を使用してファイルの構文を確認し、ファイルが行う変更を(実際には行わずに)出力します。

  1. dnscontrol preview

DNS構成ファイルの構文が正しい場合、DNSControlはそれが行う変更の概要を出力します。 これは次のようになります。

Output
******************** Domain: example.com ----- Getting nameservers from: digitalocean ----- DNS Provider: digitalocean...8 corrections #1: CREATE A example.com your-server-ipv4-address ttl=300 #2: CREATE A www.example.com your-server-ipv4-address ttl=300 #3: CREATE A mail.example.com your-server-ipv4-address ttl=300 #4: CREATE AAAA example.com your-server-ipv6-address ttl=300 #5: CREATE TXT _dmarc.example.com "v=DMARC1; p=reject; rua=mailto:abuse@example.com; aspf=s; adkim=s;" ttl=300 #6: CREATE AAAA www.example.com your-server-ipv6-address ttl=300 #7: CREATE AAAA mail.example.com your-server-ipv6-address ttl=300 #8: CREATE MX example.com 10 mail.example.com. ttl=300 ----- Registrar: none...0 corrections Done. 8 corrections.

出力にエラー警告が表示された場合、DNSControlは、ファイル内のエラーの場所と場所に関する詳細を提供します。

警告:次のコマンドは、DNSレコードおよび場合によっては他の設定にライブ変更を加えます。 既存のDNS構成のバックアップを取ることを含め、これに備えていることを確認してください。また、必要に応じてロールバックする手段があることを確認してください。

最後に、ライブDNSプロバイダーに変更をプッシュできます。

  1. dnscontrol push

次のような出力が表示されます。

Output
******************** Domain: example.com ----- Getting nameservers from: digitalocean ----- DNS Provider: digitalocean...8 corrections #1: CREATE TXT _dmarc.example.com "v=DMARC1; p=reject; rua=mailto:abuse@example.com; aspf=s; adkim=s;" ttl=300 SUCCESS! #2: CREATE A example.com your-server-ipv4-address ttl=300 SUCCESS! #3: CREATE AAAA example.com your-server-ipv6-address ttl=300 SUCCESS! #4: CREATE AAAA www.example.com your-server-ipv6-address ttl=300 SUCCESS! #5: CREATE AAAA mail.example.com your-server-ipv6-address ttl=300 SUCCESS! #6: CREATE A www.example.com your-server-ipv4-address ttl=300 SUCCESS! #7: CREATE A mail.example.com your-server-ipv4-address ttl=300 SUCCESS! #8: CREATE MX example.com 10 mail.example.com. ttl=300 SUCCESS! ----- Registrar: none...0 corrections Done. 8 corrections.

ここで、DigitalOceanコントロールパネルでドメインのDNS設定を確認すると、変更が表示されます。

ドメイン/委任ゾーンに対してDNSクエリを実行して、レコードの作成を確認することもできます。 レコードがそれに応じて更新されていることがわかります。

  1. dig +short example.com

DNSControlを使用してデプロイされたゾーンからのIPアドレスと関連するDNSレコードを示す出力が表示されます。 DNSレコードの伝播には時間がかかる場合があるため、このコマンドを待ってから再度実行する必要がある場合があります。

この最後のステップでは、DNS構成ファイルのローカル構文チェックを実行し、それをライブDNSプロバイダーに展開して、変更が正常に行われたことをテストしました。

結論

この記事では、DNSControlをセットアップし、DNS構成をライブプロバイダーに展開しました。 これで、DNS構成の変更を安全なオフライン環境で管理およびテストしてから、本番環境に展開できます。

このテーマをさらに詳しく調べたい場合は、DNSControlがCI / CDパイプラインに統合されるように設計されているため、詳細なテストを実行して、本番環境への展開をより詳細に制御できます。 また、DNSControlをインフラストラクチャの構築/展開プロセスに統合して、サーバーを展開し、それらをDNSに完全に自動的に追加できるようにすることも検討できます。

DNSControlをさらに進めたい場合は、次のDigitalOceanの記事で、DNSControlを変更管理およびインフラストラクチャ展開ワークフローに統合するのに役立ついくつかの興味深い次のステップを提供します。