Akamai Diversity

Akamai Japan ブログ

Fast DNS の API が拡張されました

Luna Control Center から Akamai Control Center への管理ポータル刷新に伴い、 Fast DNS の GUI もデザインが変わり、一部機能も拡張されています。それに合わせるように、ゾーン管理用の API である Fast DNS Zone Management API v2 が、ベータから正式リリース (GA) になっています。従来の API (v1) では、すでに GUI で作成されているゾーンに対してゾーンデータ全体をダウンロードまたはアップロードするという、二種類のオペレーションしか用意されていませんでしたが、v2 では、新たなゾーンを作成したりレコードセットを個々に編集するなど、対象範囲も操作方法も拡張されています。今回はこの API でどのような操作が可能なのか、いくつか例示的に実行してみたいと思います。

Fast DNS とは

Fast DNS は、Akamai Intelligent Platform 上に構築され、最大規模の DDoS 攻撃があってもパフォーマンスと可用性を継続的に確保できるように設計された、権威 DNS サービスです。

DNSSEC にも対応し、リソースレコードの署名、署名の更新、KSKやZSKの更新といった煩雑で慎重さを要する作業が自動化されており、DNSSEC の継続運用の負担と事故の危険性を大幅に軽減することが可能です。Fast DNS を含めた Akamai の権威 DNS についてはこちらもご参照ください。

Fast DNS ではゾーン毎に、プライマリまたはセカンダリとして設定することが可能です。プライマリとして設定する際には、外部のサーバからの移行の際などゾーンファイル形式のデータをインポートする他、GUI や API からゾーンデータを編集することができます。

しかしながら、従来の旧バージョン (v1) の API では、ゾーンデータ全体を GET によりダウンロードし、ダウンロードしたデータを編集して POST によりアップロードするという方法でゾーンデータを編集するしかなく、想定される利用シーンが限られていました。

Fast DNS を含めた Akamai の権威 DNS についてはこちらもご参照ください。

Akamai Zone Management API v2

Akamai Zone Management API v2 については、 Akamai Developer サイトで解説されています。ここでは 60 のオペレーションが 7 つのカテゴリに分かれて説明されています。

  • Zones - ゾーンの作成、設定の確認、変更等。
  • Record Sets - 特定のゾーンに対して設定されたレコードセット情報の取得、編集等。ゾーンファイル形式でのオペレーションも可能。
  • TSIG Keys - セカンダリとして設定されたゾーンの転送で認証に用いる TSIG キーのオペレーション。
  • Bulk Zone Operations - 複数のゾーンの追加等の指示を行う。実際の変更は非同期に実行されるため、別に結果を確認するオペレーションも提供。
  • Change Lists - Akamai Control Center の GUI で設定を行う際と同様、一連の変更内容を一旦変更リストに保存し、すべての変更を確認して反映させるオペレーション。
  • Zone Versions - 過去のゾーンデータ設定の履歴。特定のバージョンのデータや任意のバージョン間の差分を取り出したり、ロールバックが可能。
  • Data Services - 特定のゾーンではなくアカウントやサービス全体の情報を取得(すべて GET メソッド)。NS レコードに設定すべき FQDN の割り当てや DNSSEC 等利用可能なオプションを確認。

およそ Akamai Control Center から可能なすべてのオペレーションが行えることが分かります。

資格情報 (Credential) の準備

Akamai Zone Management API を利用する方法は、他の多くの Akamai の API と共通しています。

以下は、Akamai Developer サイトの Get Started with APIs で解説されている手順です。

  1. Akamai Control Center の「IDおよびアクセス」の管理画面にアクセス。
  2. 新しいAPIクライアントを作成する。
  3. 新しい資格情報を作成し、クライアントトークンをダウンロードする。
  4. .edgerc ファイルにクライアントトークンを追加する。

資格情報の作成手順は、弊社 Yuhki によるブログも参考にしていただければと思います (Akamai Control Center になって GUI のデザインが少し変わっていますが、手順はほぼ同じです)。

Akamai Zone Management API を利用するには、API クライアントのアクセスレベル設定で、「DNS - Zone Record Management」という API サービス名に対して「READ-WRITE」を設定する必要があります。

access-level-dns.png

資格情報を保存した .edgerc ファイルには、ここでは [dns] というセクション名にしておきます。後述の手順でこのセクション名を指定します。

$ cat ~/.edgerc 
[dns]
client_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
host = akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net
access_token = akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx
client_token = akab-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx
$

HTTPie のインストールとそれを用いた API のテスト

一般的に、新しい API をコマンドラインから試してみるためには、curl をお使いの方が多いかもしれません。ここでは、curl に似た HTTPie というコマンドラインツールを利用していきます。edgerc ファイルに保存した資格情報を元に Authorization ヘッダを生成したりといった処理を行うプラグインが提供されており、これを使うと Akamai の API を簡単に試してみることができます。

PyPI パッケージも公開されているため、インストールは pip コマンドで行うことができます。 

$ pip3 install httpie-edgegrid

これにより HTTPie 本体と Akamai によるプラグインがインストールされます。「Successfully installed httpie-edgegrid」と表示されれば完了です。HTTPie はシェルから「http」というコマンドとして実行できます。

ゾーンの設定情報取得

まずは試しに、すでに「example.com」というゾーンが設定されている前提で、このゾーンの情報を取得 (Get zone's settings) してみます。

$ http -A edgegrid -a dns: -b :/config-dns/v2/zones/example.com
{
    "activationState": "ACTIVE",
    "aliasCount": 0,
    "comment": "test",
    "contractId": "X-XXXXX",
    "lastActivationDate": "2019-10-19T05:35:41.241Z",
    "lastModifiedBy": "username",
    "lastModifiedDate": "2019-10-19T07:09:56Z",
    "signAndServe": true,
    "signAndServeAlgorithm": "ECDSA_P256_SHA256",
    "type": "PRIMARY",
    "versionId": "91deab1c-2da8-424d-b087-faf2f75555e0",
    "zone": "example.com"
}

$

HTTPie は特に REST API の実行をやりやすいように作られており、コマンドラインはシンプルです。

-A - オプションで Akamai API の認証方法を用いることを指定します

-a - edgerc ファイル内のセクション名で資格情報を指定します

-b - レスポンスボディのみを出力します(ここでは出力例をコンパクトに収めるために使用しています)。

コロン (:) に続きエンドポイントのパス部分のみ指定することにより、edgerc ファイルに指定されたホストが利用されます。

出力からは example.com ゾーンがプライマリとして設定され、また、Fast DNS の「Sign & Serve」によりECDSA_P256_SHA256 アルゴリズムで署名されていること等が分かります。

ゾーンデータをゾーンファイル形式で取得

ゾーンに設定された全てのリソースレコードの情報を JSON の配列形式で取得 (Get zone's record sets) することもできますが、ここではゾーンファイル形式で取得してみます (Get Master Zone File) 。返り値の形式 text/dns をAccept ヘッダで指定します。

$ http -A edgegrid -a dns: -b ':/config-dns/v2/zones/example.com/zone-file' Accept:text/dns
;; File Generated at 2019-10-20T11:53:14.315Z
;; Last Modified at 2019-10-19T07:09:56Z[UTC]
;; Version Identifier 91deab1c-2da8-424d-b087-faf2f75555e0
example.com.	86400	IN	NS	a10-64.akam.net.
example.com.	86400	IN	NS	a3-64.akam.net.
example.com.	86400	IN	NS	a13-66.akam.net.
example.com.	86400	IN	NS	a26-67.akam.net.
example.com.	86400	IN	NS	a1-179.akam.net.
example.com.	86400	IN	NS	a12-65.akam.net.
example.com.	86400	IN	SOA	a1-179.akam.net. hostmaster.example.com. 2019101900 3600 600 604800 300
www.example.com.	1800	IN	A	192.0.2.1

$

$ORIGIN ディレクティブなどを利用した省略を用いない、フラットなゾーンファイルですね。

レコードセットの追加

次に www.example.com に AAAA レコードを追加してみます。レコードセットの追加を行うオペレーションは、配列で複数追加するオペレーション (Creative multiple record sets) と、一つだけ追加するオペレーション (Create a record sets) があります。ここでは一つだけしかレコードセットを追加しませんが、より汎用的な前者を使ってみましょう。入力となる JSON のフォーマットはドキュメントに例が記載されています。ここでは続けて先ほどと同じコマンドで結果を確認します。

$ echo '{"recordsets":[{"name": "www.example.com", "type": "AAAA", "ttl": 1800, "rdata": ["2001:0db8::1","2001:0db8::2"]}]}' | http -A edgegrid -a dns: ':/config-dns/v2/zones/example.com/recordsets'
HTTP/1.1 204 No Content
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: keep-alive
Date: Sun, 20 Oct 2019 13:14:53 GMT
ETag: "d54ad06b-7b54-46ae-a375-d49e6c342b0a"
Expires: 0
Pragma: no-cache
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Trace-Id: 54345dac5dcc0b06
X-XSS-Protection: 1; mode=block


$ http -A edgegrid -a dns: -b ':/config-dns/v2/zones/example.com/zone-file' Accept:text/dns
;; File Generated at 2019-10-20T12:13:55.273Z
;; Last Modified at 2019-10-20T12:12:47.168Z[UTC]
;; Version Identifier 74f26ec0-954e-48d9-8e36-f5d3e468f29f
example.com.	86400	IN	NS	a10-64.akam.net.
example.com.	86400	IN	NS	a3-64.akam.net.
example.com.	86400	IN	NS	a13-66.akam.net.
example.com.	86400	IN	NS	a26-67.akam.net.
example.com.	86400	IN	NS	a1-179.akam.net.
example.com.	86400	IN	NS	a12-65.akam.net.
example.com.	86400	IN	SOA	a1-179.akam.net. hostmaster.example.com. 2019101901 3600 600 604800 300
www.example.com.	1800	IN	AAAA	2001:db8:0:0:0:0:0:1
www.example.com.	1800	IN	AAAA	2001:db8:0:0:0:0:0:2
www.example.com.	1800	IN	A	192.0.2.1

$ 

2 つの値を持つ AAAA レコードセットが追加されました。SOA レコードのシリアル値も自動的にインクリメントされています。

DNSSEC ステータスの確認

指定したゾーンに対し、委任元ゾーンに登録すべき DS レコードの情報等を取得できます (Get zone's DNSSEC status)。Fast DNS では委任元に登録された DS レコードをチェックしており DS レコードが登録されていなかったりDSレコードが更新されていない場合等にアラートを出したり旧 KSK による署名を廃止しないようになっていますが、ここではそのアラートの状態も確認できます。

$ echo '{"zones":["example.com"]}' | http -A edgegrid -a dns: -b :/config-dns/v2/zones/dns-sec-status
{
    "dnsSecStatuses": [
        {
            "alerts": [],
            "currentRecords": {
                "dnskeyRecord": "example.com. 7200 IN DNSKEY 257 3 13 (4gFkiybX/qg4OesdSxxQfEwksmUoVbBYg6Eedy1Ace9Y/oqo0A376g+/AMU+T+QkNhHBbCNsxWX9hxD/xx6oEg== ) ",
                "dsRecord": "example.com. 86400 IN DS 34859 13 2 ( 5b58255a40052400f723c0c7649a9302fcfc113b5f1a5904e88d24b35b63c86c ) ",
                "expectedTtl": 86400,
                "lastModifiedDate": "2019-10-19T05:34:16Z"
            },
            "zone": "example.com"
        }
    ]
}

$ 

"dsRecord" の値が委任元ゾーンに登録すべき DS レコードの情報です。

最後に

今回は、Fast DNS の API によるオペレーションをゾーンとレコードの編集を中心にいくつかピックアップして実行してみましたが、先述のように、Fast DNS Zone Management API v2 では Fast DNS に対して単純なゾーンデータ編集にとどまらない、およそ Akamai Control Center から可能なすべてのオペレーションが行えます。

ゾーン毎にロールベースのアクセスコントロールを行うインターフェイスを作成したい、といった大掛かりなアプリケーションの要求にも応えられそうです。

通常の利用においても、ゾーン転送で用いられる TSIG キー、DNSSEC で用いられる DS レコード、ACME等の認証用の TXT レコード等、定期的に更新が求められるオペレーションを自動化、省力化するのにも役立つでしょう。

「SOA のシリアル値の変化を一覧できたらよい」という要望を伺ったことがあります。こういった GUI 上から直接できないことも、 API を使えば簡単なスクリプトで実現できます。

API の活用により Fast DNS の利用の仕方が広がることを期待してます。