Debian10でDNSControlを使用してDNSを展開および管理する方法
著者は、 Electronic Frontier Foundation Inc を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
DNSControlはinfrastructure-as-codeツールであり、バージョン管理、テスト、自動展開などの標準的なソフトウェア開発原則を使用してDNSゾーンを展開および管理できます。 DNSControlはStackExchangeによって作成され、Goで記述されています。
DNSControlを使用すると、ゾーンファイルがプログラム可能な形式で保存されるため、手動のDNS管理の落とし穴の多くが解消されます。 これにより、ゾーンを複数のDNSプロバイダーに同時に展開し、構文エラーを識別し、DNS構成を自動的にプッシュして、人的エラーのリスクを減らすことができます。 DNSControlのもう1つの一般的な使用法は、DNSを別のプロバイダーにすばやく移行することです。 たとえば、DDoS攻撃やシステム停止が発生した場合です。
このチュートリアルでは、DNSControlをインストールして構成し、基本的なDNS構成を作成して、ライブプロバイダーへのDNSレコードの展開を開始します。 このチュートリアルの一部として、DNSプロバイダーの例としてDigitalOceanを使用します。 別のプロバイダーを使用する場合、セットアップは非常に似ています。 終了すると、安全なオフライン環境でDNS構成を管理およびテストし、それを本番環境に自動的に展開できるようになります。
前提条件
このガイドを開始する前に、次のものが必要です。
- Debian 10を使用した初期サーバーセットアップに従ってセットアップされた1台のDebian10サーバー。これには、sudo非rootユーザーと、ファイアウォールが非必須ポートをブロックできるようになっています。
your-server-ipv4-address
は、ウェブサイトまたはドメインをホストしているサーバーのIPアドレスを指します。your-server-ipv6-address
は、ウェブサイトまたはドメインをホストしているサーバーのIPv6アドレスを指します。 - がサポートするプロバイダーによってホストされているDNSに完全に登録されたドメイン名。 このチュートリアルでは、全体で
your_domain
を使用し、サービスプロバイダーとしてDigitalOceanを使用します。 - 読み取りおよび書き込み権限を持つDigitalOceanAPIキー(パーソナルアクセストークン)。 作成するには、パーソナルアクセストークンの作成方法にアクセスしてください。
これらの準備ができたら、root以外のユーザーとしてサーバーにログインして開始します。
ステップ1—DNSControlをインストールする
DNSControlはGoで記述されているため、サーバーにGoをインストールし、GOPATH
を設定することからこの手順を開始します。
GoはDebianのデフォルトのソフトウェアリポジトリ内で利用可能であり、従来のパッケージ管理ツールを使用してインストールすることができます。
また、Gitをインストールする必要があります。これは、GoがGitHubのリポジトリからDNSControlソフトウェアをダウンロードしてインストールできるようにするために必要です。
ローカルパッケージインデックスを更新して、新しいアップストリームの変更を反映することから始めます。
- sudo apt update
次に、golang-go
およびgit
パッケージをインストールします。
- sudo apt install golang-go git
インストールを確認した後、apt
は、GoとGit、およびそれらに必要なすべての依存関係をダウンロードしてインストールします。
次に、Goに必要なパス環境変数を構成します。 これについて詳しく知りたい場合は、GOPATHの理解でこのチュートリアルを読むことができます。 ~/.profile
ファイルを編集することから始めます。
- nano ~/.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 2.9-dev
dnscontrol: command not found
エラーが表示された場合は、Goパスの設定を再確認してください。
DNSControlをインストールしたので、構成ディレクトリを作成し、DNSControlをDNSプロバイダーに接続して、DNSレコードを変更できるようにすることができます。
ステップ2—DNSControlの構成
このステップでは、DNSControlに必要な構成ディレクトリを作成し、DNSプロバイダーに接続して、DNSレコードにライブ変更を加え始めることができるようにします。
まず、DNSControl構成を保存できる新しいディレクトリを作成してから、そのディレクトリに移動します。
- mkdir ~/dnscontrol
- cd ~/dnscontrol
注:このチュートリアルでは、DNSControlの初期設定に焦点を当てます。 ただし、本番環境で使用する場合は、DNSControl構成を Git などのバージョン管理システム(VCS)に保存することをお勧めします。 これの利点には、完全なバージョン管理、テストのためのCI / CDとの統合、シームレスなロールバック展開などが含まれます。
DNSControlを使用してBINDゾーンファイルを書き込む場合は、zones
ディレクトリも作成する必要があります。
- mkdir ~/dnscontrol/zones
BINDゾーンファイルは、DNSゾーン/レコードをプレーンテキスト形式で保存するための生の標準化された方法です。 もともとはBINDDNSサーバーソフトウェアに使用されていましたが、現在ではDNSゾーンを保存するための標準的な方法として広く採用されています。 DNSControlによって生成されたBINDゾーンファイルは、カスタムまたはセルフホストのDNSサーバーにインポートする場合、または監査目的で役立ちます。
ただし、DNSControlを使用してDNSの変更を管理対象プロバイダーにプッシュするだけの場合は、zones
ディレクトリは必要ありません。
次に、creds.json
ファイルを構成する必要があります。これにより、DNSControlがDNSプロバイダーに対して認証を行い、変更を加えることができます。 creds.json
の形式は、使用しているDNSプロバイダーによって若干異なります。 独自のプロバイダーの構成を見つけるには、公式DNSControlドキュメントのサービスプロバイダーリストを参照してください。
~/dnscontrol
ディレクトリにファイルcreds.json
を作成します。
- cd ~/dnscontrol
- nano creds.json
DNSプロバイダーのサンプルcreds.json
構成をファイルに追加します。 DNSプロバイダーとしてDigitalOceanを使用している場合は、次を使用できます。
{
"digitalocean": {
"token": "your-digitalocean-oauth-token"
}
}
このファイルは、DNSControlに接続するDNSプロバイダーを通知します。
DNSプロバイダーに何らかの形式の認証を提供する必要があります。 これは通常、APIキーまたはOAuthトークンですが、公式のDNSControlドキュメントのサービスプロバイダーリストに記載されているように、一部のプロバイダーは追加情報を必要とします。
警告:このトークンはDNSプロバイダーアカウントへのアクセスを許可するため、パスワードと同じように保護する必要があります。 また、バージョン管理システムを使用している場合は、トークンを含むファイルが除外されていることを確認してください(例: .gitignore
)を使用するか、何らかの方法で安全に暗号化されます。
DNSプロバイダーとしてDigitalOceanを使用している場合は、前提条件の一部として生成したDigitalOceanアカウント設定で必要なOAuthトークンを使用できます。
複数の異なるDNSプロバイダーがある場合(たとえば、複数のドメイン名や委任されたDNSゾーンの場合)、これらすべてを同じcreds.json
ファイルで定義できます。
初期DNSControl構成ディレクトリを設定し、DNSControlがDNSプロバイダーに対して認証して変更できるようにcreds.json
を構成しました。 次に、DNSゾーンの構成を作成します。
ステップ3—DNS構成ファイルを作成する
このステップでは、ドメイン名または委任されたDNSゾーンのDNSレコードを含む初期DNS構成ファイルを作成します。
dnsconfig.js
は、DNSControlのメインDNS構成ファイルです。 このファイルでは、DNSゾーンとそれに対応するレコードがJavaScript構文を使用して定義されています。 これはDSLまたはドメイン固有言語として知られています。 DNSControlの公式ドキュメントのJavaScriptDSL ページに、詳細が記載されています。
まず、~/dnscontrol
ディレクトリにDNS構成ファイルを作成します。
- cd ~/dnscontrol
- nano dnsconfig.js
次に、次のサンプル構成をファイルに追加します。
// Providers:
var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_DIGITALOCEAN = NewDnsProvider('digitalocean', 'DIGITALOCEAN');
// Domains:
D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
A('@', 'your-server-ipv4-address')
);
このサンプルファイルは、特定のプロバイダー(この場合はDigitalOceanによってホストされるyour_domain
)のドメイン名または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。
ドメイン修飾子は、A
、AAAA
、MX
、TXT
、NS
、[ X133X]