6715.jp

2018-12-21

ConoHaのDNSをAPIから操作する話

sekaisekai
APIConoHaDNSLet's Encryptアドベントカレンダー

この記事はConoHa Advent Calendar 2018の21日目の記事です!

ConoHaのDNS APIは便利

という話を2年前にもしたのでした。

皆さん、ConoHaのDNS API使ってますか? Let's EncryptのDNS-01チャレンジの自動化にも使える!のでイケてますね。

APIクライアントについて

さて、ではどうやってAPIを叩くか? 先に紹介した記事の要旨は「ConoHa DNS用 APIクライアント 作った」なんですが、あまりにも使い辛いので無視します。

Designateクライントを使う

ConoHaのDNSはOpenStack Designateを使っているようです。多分。API体系がソレっぽいので。

なので、Designateのクライアントが使えるかもしれない……?(未確認)

しかし、ConoHaではdeprecatedなv1 APIのみ提供されているので、互換性の面で死ぬかもしれません。 一応v2も動いているようですが、不完全なようですし、そもそもundocumentedです。

Lexiconを使う

様々なDNSサービスを1つのCLIから使えるようにしたソフトウェアがLexiconです。

なんとConoHa DNSに対応しています!すごい!! (まぁ、ボクが使うために対応させたからなんですケド……)

便利なので使ってください。pipさえあればGetできます。 こんな具合に使えるかと思います。

$ pip install dns-lexicon

$ lexicon conoha
usage: lexicon conoha [-h] [--name NAME] [--content CONTENT] [--ttl TTL]
                      [--priority PRIORITY] [--identifier IDENTIFIER]
                      [--log_level {CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET}]
                      [--output {TABLE,TABLE-NO-HEADER,JSON,QUIET}]
                      [--auth-region AUTH_REGION] [--auth-token AUTH_TOKEN]
                      [--auth-username AUTH_USERNAME]
                      [--auth-password AUTH_PASSWORD]
                      [--auth-tenant-id AUTH_TENANT_ID]
                      {create,list,update,delete} domain
                      {A,AAAA,CNAME,MX,NS,SOA,TXT,SRV,LOC}

$ lexicon conoha --auth-region tyo1 --auth-username gncu01234567 --auth-password xxxxxxxxxxx --auth-tenant-id 0123456789abcdef0123456789abcdef create narusejun.com A --name local --content 127.0.0.1
$ lexicon conoha --auth-region tyo1 --auth-username gncu01234567 --auth-password xxxxxxxxxxx --auth-tenant-id 0123456789abcdef0123456789abcdef list narusejun.com A
ID                                   TYPE NAME                CONTENT   TTL
------------------------------------ ---- ------------------- --------- ----
42929801-5111-41d5-a115-9f67a1d07810 A    local.narusejun.com 127.0.0.1 3600

詳しくは公式のドキュメントを読んでください。 Let's EncryptのDNS-01を自動化するやり方も紹介されていますよ!

Let's EncryptのDNS-01チャレンジを自動化する

せっかくAPIでDNSレコードを操作できるわけですし、活用したいですね!

最近ワイルドカード証明書が取れるようになったLet's Encryptと連携してみましょう。 ちなみに、ワイルドカード証明書はDNS-01チャレンジでしか取得できません!

LexiconとDehydratedを使う

先ほど紹介したlexiconと、ACMEクライアントDehydratedを組み合わせるやり方がlexiconの作者さんによって紹介されています。

Legoを使う

2つのソフトウェアを連携させるのは面倒ですし、できればパパッとコマンド1つで証明書取りたいですよね? そこで、Go製のACMEクライアントlegoを使いましょう! legoでは、いろんなDNS-Providersが提供されていて、対応しているDNSサービスならすぐに証明書を発行できます。

なんとConoHa DNSに対応しています!すごい!! (まぁ、ボクが使うために対応させたからなんですケド……)

バイナリが入手可能なほか、goがインストールされているならgo getですぐに入手できます。 こういう感じで使います。とっても便利ですよ!

$ go get -u github.com/xenolf/lego/cmd/lego

$ lego dnshelp
Credentials for DNS providers must be passed through environment variables.

Valid providers and their associated credential environment variables:
        conoha:         CONOHA_REGION, CONOHA_TENANT_ID, CONOHA_API_USERNAME, CONOHA_API_PASSWORD

Additional configuration environment variables:
        conoha:         CONOHA_POLLING_INTERVAL, CONOHA_PROPAGATION_TIMEOUT, CONOHA_TTL, CONOHA_HTTP_TIMEOUT

$ export CONOHA_REGION=tyo1
$ export CONOHA_TENANT_ID=0123456789abcdef0123456789abcdef
$ export CONOHA_API_USERNAME=gncu01234567
$ export CONOHA_API_PASSWORD=xxxxxxxxxxx
$ lego --dns conoha --server https://acme-staging-v02.api.letsencrypt.org/directory --email [email protected] --domains narusejun.com --domains *.narusejun.com run
2018/12/21 02:44:58 [INFO] [narusejun.com, *.narusejun.com] acme: Obtaining bundled SAN certificate
2018/12/21 02:44:59 [INFO] [*.narusejun.com] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/wcYZJB5aWmfi4WzGuwv2JlSaYjryGf67zqES8h8bmEg
2018/12/21 02:44:59 [INFO] [narusejun.com] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/gwXBvxvuHk7TrUYbuu3MWp7heVoLTTle7Nh2ng98b74
2018/12/21 02:44:59 [INFO] [narusejun.com] acme: Authorization already valid; skipping challenge
2018/12/21 02:44:59 [INFO] [narusejun.com] acme: Preparing to solve DNS-01
2018/12/21 02:45:00 [INFO] [narusejun.com] acme: Trying to solve DNS-01
2018/12/21 02:45:00 [INFO] [narusejun.com] Checking DNS record propagation using [1.0.0.1:53]
2018/12/21 02:45:00 [INFO] Wait [timeout: 1m0s, interval: 2s]
2018/12/21 02:45:37 [INFO] [narusejun.com] The server validated our request
2018/12/21 02:45:38 [INFO] [narusejun.com, *.narusejun.com] acme: Validations succeeded; requesting certificates
2018/12/21 02:45:39 [INFO] [narusejun.com] Server responded with a certificate.

$ openssl x509 -in ~/.lego/certificates/narusejun.com.crt -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            fa:78:5b:6e:73:74:37:e6:c4:36:54:82:02:04:d2:7e:bd:0b
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = Fake LE Intermediate X1
        Validity
            Not Before: Dec 20 16:45:40 2018 GMT
            Not After : Mar 20 16:45:40 2019 GMT
        Subject: CN = narusejun.com
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:*.narusejun.com, DNS:narusejun.com

……と、サクッとワイルドカード証明書が取れてしまいました。すごい!便利!

上の例はstaging環境から証明書を取得しているので、マネする際はご注意ください! 詳しくは、例によって公式ドキュメントをごらんください。

traefikを使う

traefikは強いL7ロードバランサみたいなものです(ざっくりとした説明)。 Let's Encryptから自動で証明書を取る機能がついてるんですが、この機能は内部で先述したlegoを利用しています。

……ということは、ConoHa DNSに対応しています! 詳しい説明は省きますが、公式ドキュメントを参考に設定してみてください。 ちゃんとConoHa DNSと連携して動作することを確認済みです。

おわりに

紹介したソフトウェア以外にも、LexiconやLegoを内部で使ってる系ソフトが実はConoHaに対応してるパターンがいっぱいあるかもしれません。このソフトでもConoHa DNS使えたよ!とかあったら教えてください。 ちなみに、CaddyというHTTPサーバがLegoの全DNSプロバイダに対応しそうだったりするので、そしたらConoHaも使えるようになりますね!


ConoHaのDNS、めっちゃ便利なので使いましょう。 APIでレコードいじれるし、ゾーン数がいくつあっても無料ってマジ!?神じゃん。

あっ、ボクのパソコン見てください。