Let's Encrypt がワイルドカード証明書に対応したので、当サイトもワイルドカード証明書に変更しました。

ドメインの所有者確認のために、ワイルドカード証明書の認証の際に、DNS の TXT レコードに認証情報を書き込む必要があります。最初の取得時はともかく、更新時に手動で TXT レコードの変更作業をやるのはさすがに無理なので、自動更新できる API が用意されている MyDNS の利用を始めました。

MyDNS では定期的に IP アドレスの通知が必要です。静的アドレスの場合は、1日 1回の通知で十分なので、/etc/cron.daily/mydns-notify-ip.sh をこんな感じで作って、通知を自動化します。

#!/bin/bash

URL=https://ipv4.mydns.jp/login.html
AUTH=masterid:password

RESULT=`curl -s -S -I -f -u ${AUTH} ${URL} | head -1`
logger -t MyDNS "${URL} - $RESULT"

AUTH= の行は、各自の ID とパスワードに変更してください。パスワードを直書きしているので、オーナーとパーミッションは適切に設定しましょう。

$ sudo chown root:wheel /etc/cron.daily/mydns-notify-ip.sh
$ sudo chmod 700 /etc/cron.daily/mydns-notify-ip.sh
$

ネットの情報では、https でははく、http で通知しているものを結構見かけますが、悪意の第三者にパスワードを奪われる可能性があるので、さすがにそれは止めた方が良いでしょう。

動作を監視する

curl の結果を /dev/null に捨てているものも多く見かけますが、私のルールでは、自動化した処理は人間の監視が必須なので、このスクリプトは /var/log/messages に以下のようなログを残します。

Apr  5 22:24:55 hostname MyDNS: https://ipv4.mydns.jp/login.html - HTTP/1.1 200 OK

何かの理由で通知が失敗した場合は cron のメールで知らせてほしいので、-f を付けて、エラーが起きたら標準エラー出力に流すようにしてあります。

念のため、logwatch でもログを送るように設定しておきます。設定例としては、こんな感じです。

/etc/logwatch/conf/services/mydns.conf

Title = "MyDNS"
LogFile = messages
*OnlyService = MyDNS
*RemoveHeaders">

/etc/logwatch/scripts/services/mydns(実行パーミションが必要です)

#!/usr/bin/sed -f
s/^/  /

これで、logwatch が毎日こんなメールを送ってくれるので、200 が返ってきてれば OK です。

--------------------- MyDNS Begin ------------------------ 

  https://ipv4.mydns.jp/login.html - HTTP/1.1 200 OK

---------------------- MyDNS End ------------------------- 

ここでは書きませんが、動的アドレスで利用する場合は、もっと頻繁に通知処理を行うので、monit などでログ監視するのもよいと思います。いずれにせよ、自動処理の結果を /dev/null に捨てるのはよくないです。

パスワードを別ファイルにする

シェルスクリプト内にパスワードを直書きするのに抵抗がある場合は、こんな感じで別ファイル(以下の例では /root/.mydns)から読み込んでも良いと思います。

#!/bin/bash

URL=https://ipv4.mydns.jp/login.html
AUTH=`cat /root/.mydns`

RESULT=`curl -s -S -I -f -u ${AUTH} ${URL} | head -1`
logger -t MyDNS "${URL} - $RESULT"

セキュリティを考えた場合、パスワードを暗号化する意味はないですのでそこはお好みで。ネットで調べると、openssl で暗号化する方法とか出てきますが、これでは大事なものを金庫に仕舞ったものの、肝心の鍵はすぐ隣にぶら下げているような状態ですので、労力の無駄遣いだと思います。どうしてもやりたいなら、最低限、鍵は物理的に別のデバイスに保存しないと、気休め以上の効果はないです。物理サーバならともかく VPS では TPM もないので、安全に鍵を保管する手段がないです。

おわりに

今回の記事は、定期的に特定の URL にアクセスするだけのシンプルな処理ですが、自動化する時は、私はこれくらいのことを考えています。まだ抜けがあったら、是非コメントで教えてください。