Ubuntu 18.04でDNSControlを使用してDNSを展開および管理する方法

著者はhttps://www.brightfunds.org/organizations/electronic-frontier-foundation-inc[Electronic Frontier Foundation Inc]を選択して、https://do.co/w4do-cta [Write DOnations]プログラム。

前書き

DNSControlは、標準を使用してDNSゾーンを展開および管理できるhttps://en.wikipedia.org/wiki/Infrastructure_as_code[infrastructure-as-code]ツールですバージョン管理、テスト、自動展開を含むソフトウェア開発の原則。 DNSControlはStack Exchangeによって作成され、Goで記述されています。

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

このチュートリアルでは、DNSControlをインストールして構成し、基本的なDNS構成を作成し、ライブレコードへのDNSレコードの展開を開始します。 このチュートリアルの一環として、DigitalOceanをDNSプロバイダーの例として使用します。 https://stackexchange.github.io/dnscontrol/provider-list [異なるプロバイダー]を使用する場合、セットアップは非常に似ています。 完了したら、安全なオフライン環境でDNS構成を管理およびテストし、それを自動的に運用環境に展開できます。

前提条件

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

  • Ubuntu 18.04での初期サーバー設定に従ってsudo非rootユーザーおよび有効化されたファイアウォールが非必須ポートをブロックします。 「++」は、ウェブサイトまたはドメインをホストしているサーバーのIPアドレスを指します。

  • https://github.com/StackExchange/dnscontrol#dnscontrol [サポートされているプロバイダー]によってホストされているDNSで完全に登録されたドメイン名。 このチュートリアルでは、全体で「++」を使用し、DigitalOceanをサービスプロバイダーとして使用します。

  • 読み取りおよび書き込み権限を持つDigitalOcean APIキー(パーソナルアクセストークン)。 作成するには、https://www.digitalocean.com/docs/api/create-personal-access-token/ [パーソナルアクセストークンの作成方法]にアクセスしてください。

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

ステップ1-DNSControlのインストール

DNSControlはGoで記述されているので、Goをサーバーにインストールし、 `+ GOPATH +`を設定してこのステップを開始します。

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

最初に、ローカルパッケージインデックスを更新して、新しいアップストリームの変更を反映します。

sudo apt update

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

sudo apt install golang-go

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

次に、Goに必要なパス環境変数を構成します。 これについて詳しく知りたい場合は、https://www.digitalocean.com/community/tutorials/understanding-the-gopath [GOPATHの理解]でこのチュートリアルを読むことができます。 `+〜/ .profile`ファイルを編集することから始めます:

nano ~/.profile

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

〜/ .profile

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

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

source ~/.profile

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

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

go get github.com/StackExchange/dnscontrol

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

dnscontrol version

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

Outputdnscontrol

「+ dnscontrol:コマンドが見つかりません」というエラーが表示される場合は、Goパスの設定を再確認してください。

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

ステップ2-DNSControlの構成

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

最初に、DNSControl構成を保存できる新しいディレクトリを作成し、そこに移動します。

mkdir ~/dnscontrol
cd ~/dnscontrol

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

mkdir ~/dnscontrol/zones

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

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

次に、 `+ creds.json`ファイルを設定する必要があります。これにより、DNSControlがDNSプロバイダーを認証して変更を加えることができます。 `+ creds.json +`の形式は、使用しているDNSプロバイダーによってわずかに異なります。 DNSControlの公式ドキュメントのhttps://stackexchange.github.io/dnscontrol/provider-list [サービスプロバイダーリスト]を参照して、独自のプロバイダーの構成を見つけてください。

`〜/ dnscontrol +`ディレクトリにファイル ` creds.json +`を作成します:

cd ~/dnscontrol
nano creds.json

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

〜/ dnscontrol / creds.json

{
 "digitalocean": {
   "token": ""
 }
}

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

DNSプロバイダーに何らかの認証を提供する必要があります。 これは通常、APIキーまたはOAuthトークンですが、一部のプロバイダーでは、公式のDNSControlドキュメントのhttps://stackexchange.github.io/dnscontrol/provider-list [サービスプロバイダーリスト]に記載されているように、追加情報が必要です。

DNSプロバイダーとしてDigitalOceanを使用している場合、前提条件の一部として生成した必要なOAuthトークンhttps://cloud.digitalocean.com/settings/applications[DigitalOceanアカウント設定]を使用できます。

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

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

ステップ3-DNS構成ファイルの作成

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

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

最初に、 `+〜/ dnscontrol +`ディレクトリにDNS設定ファイルを作成します:

cd ~/dnscontrol
nano dnsconfig.js

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

〜/ dnscontrol / dnsconfig.js

// Providers:

var  = NewRegistrar('', '');
var  = NewDnsProvider('', '');

// Domains:

D('', , DnsProvider(),
   A('@', '')
);

このサンプルファイルは、特定のプロバイダーのドメイン名またはDNSゾーンを定義します。この場合、DigitalOceanがホストする「+」です。 ドメイン/ウェブサイトをホストしているサーバーのIPv4アドレスを指す、ゾーンルート( ` @ `)の例の「 A +」レコードも定義されています。

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

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

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

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

https://stackexchange.github.io/dnscontrol/provider-list [サービスプロバイダーリスト]を使用して、それに応じて「+ NewRegistrar()」、「 NewDnsProvider()」、および「 D()+」を設定する必要がありますDNSControlの公式ドキュメント。

DNSプロバイダーとしてDigitalOceanを使用しており、DNSの変更のみを行う必要がある場合(権限のあるネームサーバーではなく)、前述のコードブロックのサンプルは既に正しいです。

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

このステップでは、関連するプロバイダーを定義して、DNSControl用のDNS構成ファイルをセットアップします。 次に、便利なDNSレコードをファイルに追加します。

手順4-DNS構成ファイルの作成

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

DNSレコードが生の行ごとの形式で書き込まれる従来のBINDゾーンファイルとは異なり、DNSControl内のDNSレコードは、簡単に示すように、「+ D()+」関数の関数パラメーター(ドメイン修飾子)として定義されます手順3で。

ドメイン修飾子は、「+ A 」、「 AAAA 」、「 MX 」、「 TXT 」、「 NS 」、「 CAA +」などを含む標準DNSレコードタイプごとに存在します。 利用可能なレコードタイプの完全なリストは、DNSControlドキュメントのhttps://stackexchange.github.io/dnscontrol/js#domain-modifiers[Domain Modifiers]セクションで入手できます。

個々のレコードの修飾子も使用できます(レコード修飾子)。 現在、これらは主に個々のレコードのTTL(有効期間)を設定するために使用されます。 利用可能なレコード修飾子の完全なリストは、DNSControlドキュメントのhttps://stackexchange.github.io/dnscontrol/js#record-modifiers[Record Modifiers]セクションにあります。 レコード修飾子はオプションであり、ほとんどの基本的な使用例では省略できます。

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

  • `+ A +`レコード:

  • 目的:IPv4アドレスを指すこと。

  • 構文: + A( ''、 ''、オプションのレコード修飾子)+

  • 例: + A( ''、 ''、TTL())+

  • `+ AAAA +`レコード:

  • 目的:IPv6アドレスを指すこと。

  • 構文: + AAAA( ''、 ''、オプションのレコード修飾子)+

  • 例: + AAAA( ''、 '')+(レコード修飾子は省略されているため、デフォルトのTTLが使用されます)

  • `+ CNAME +`レコード:

  • 目的:ドメイン/サブドメインを他のドメインのエイリアスにする。

  • 構文: + CNAME( ''、 ''、オプションのレコード修飾子)+

  • 例: + CNAME( ''、 '')+(値にドットがある場合は、末尾の *を含める必要があることに注意してください)

  • `+ MX +`レコード:

  • 目的:特定のサーバー/アドレスに電子メールを送信します。

  • 構文: + MX( ''、 ''、 ''、オプションのレコード修飾子)+

  • 例: + MX( ''、、 '')+(値にドットが含まれる場合は、末尾の *を含める必要があることに注意してください)

  • `+ TXT +`レコード:

  • 目的:任意のプレーンテキストを追加します。多くの場合、独自の専用レコードタイプのない構成に使用されます。

  • 構文: + TXT( ''、 ''、オプションのレコード修飾子)+

  • 例: + TXT( ''、 '')+

  • `+ CAA +`レコード:

  • 目的:ドメイン/サブドメインのTLS証明書を発行できる認証機関(CA)を制限および報告します。

  • 構文: + CAA( ''、 ''、 ''、オプションのレコード修飾子)+

  • 例: + CAA( ''、 ''、 '')+

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

cd ~/dnscontrol
nano dnsconfig.js

次に、前のリストで説明した構文とhttps://stackexchange.github.io/dnscontrol/js#domain-modifiers [公式DNSControlドキュメントのDomain Modifiers]セクション。 各レコードの間にコンマ( )を使用する必要があります。

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

〜/ dnscontrol / dnsconfig.js

...

D('', , DnsProvider(),
   A('', ''),
   A('', ''),
   A('', ''),
   AAAA('', ''),
   AAAA('', ''),
   AAAA('', ''),
   MX('', , ''),
   TXT('', ''),
   TXT('', '')
);

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

このステップでは、DNSレコードを含む初期DNS構成ファイルをセットアップします。 次に、構成をテストして展開します。

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

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

最初に、 `+ dnscontrol`ディレクトリに移動します:

cd ~/dnscontrol

次に、DNSControlの「+ preview +」関数を使用してファイルの構文を確認し、ファイルにどのような変更を加えるかを出力します(実際には変更しません)。

dnscontrol preview

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

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

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

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

dnscontrol push

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

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

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

image:https://assets.digitalocean.com/articles/dnscontrols1804/step5a.png [DNSControlが行ったDNS変更の一部を示すDigitalOceanコントロールパネルのスクリーンショット]

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

dig +short

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

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

結論

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

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

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

Related