どさにっきキャッシュレス

by やまや
3月中旬

2019年3月11日(月)

KnotDNS

_ 昨年の IW2018 の資料が公開されたようで

_ 自分は Knot DNS の話をしたですよ。DNSSEC やりたいけどあんなの運用まわらん、とか、Let's Encrypt で DNS 認証させたいけど自動化できなくてめんどくさい、とか言ってる人いればぜひ Knot を使ってみてくださいませ。自動化できるよ。まあ、BIND でできないわけじゃないけど。いきない Knot に乗り換えるのが怖くても、資料にあるように、BIND やら NSD やら使い慣れたものを前段、後段に置いて三段構成にすれば、Knot をほとんど意識せず、これまでとほとんど変わらない感覚で自動化できるよ。

_ 資料に書こうか迷ったけど結局やめておいたネタ。

_ 資料では Let's Encrypt の dns-01 認証による証明書取得を自動化する方法について触れてるけど、そうはいってもうちのゾーンは商用の権威 DNS ホスティングに預けちゃってるもん、せっかく DNS の運用を手放して人まかせにできたのに、という場合でも、そのサービスでサブドメインの NS レコードを書けるのであれば Let's Encrypt の証明書取得は自動化できる。

_acme-challenge.example.com.	IN	NS	hoge.exmaple.com.
のように _acme-challenge だけ別サーバに委譲しちゃえばよい。委譲されたホストで dynamic update を受けつけるように Knot を設定しておけば(BIND でもいいけど)、certbot + rfc2136 plugin (lego でもいいけど)で Let's Encrypt な証明書の取得を自動化できる。

_ サブドメインだけとはいえ DNS を動かすなら運用を手放した意味ないじゃん、ということにはならない。なぜなら、_acme-challenge へのクエリなんて証明書取得の際に数回やってくるだけで、それ以外のときは無視してもまったく問題ないから。

_ つまり、この dynamic update な Knot は常時動かしておくのではなく、certbot の pre-hook/post-hook に起動/停止スクリプトを仕込んでおけばいいのだ。証明書取得にかかる数十秒の間しか DNS サーバが動かないのでふだんはリソース消費ゼロで、それ用のサーバを用意するなんてもったいないことをしなくても他用途のサーバで片手間にやらせておけば十分。動いてないときに親ゾーン側の _acme-challenge の NS が消えるわけじゃないので lame になるけど、誰もクエリを投げてこないのでこれも気にしなくてよし。

_ 試さずにたぶんできるはず、と言ってるわけではなく、動作実績もある。そこの環境では _acme-challenge の委譲先には AAAA レコードがあるだけで A がなく、そして certbot の pre/post-hook には Knot の起動/停止だけでなく IPv6 アドレスの付与/削除も仕込んである。ふだんは DNS の問い合わせに応答しないどころか ping6 にすら答えないが、証明書更新作業をおこなう数十秒の間だけ v6 only な DNS サーバとして動く(let's encrypt 側も v6 に対応してるので v4 いらない)。これでまったく問題なく Let's Encrypt の証明書を取得できている。

Hello, world 記号ゴルフ

_ 先日のものの環境依存性(できるだけ)排除版。POSIX な sh ならどれでも動き、どの OS でもたいてい動く。96バイト。

_(){ _=$@;}
_ /???;! _ /???/???/?${_##*/??}
${_##*/} \#-$?:-@[-_ \\$?$?$#,_-{<<_
#+::=$ _=@:*!
_

_ こないだは解説しなかったけどちょっと解説。

_ _(){ _=$@;} は引数を変数に代入するだけの関数。次の行で /??? を引数にこの関数を呼んでるけど、ふつーに _=/??? のように代入すると $_ の値はそのまま "/???" という文字列になってしまう。関数を通すことで、/??? という文字列そのものではなく、ワイルドカードにマッチしたパスを展開した文字列、つまり "/bin /dev ... /usr /var" を得ることができる。

_ bash だと関数の実行後さらに、特殊変数 $_ への値の代入がおこなわれる(関数で代入した値を上書きする)。$_ は直前のコマンドの最後の引数をあらわし、つまり今回の場合は "/var" になる。bash では $_ に値がセットされれば関数でなくてもかまわないので、関数を定義せず、"_" という関数呼び出しを ":" という何もしないコマンドに置き替えてもちゃんと動く。

_ ${_##*/??} は $_ から */?? というパターンに一致する部分を先頭から最長マッチで取り除いた文字列。$_ の中身は "/bin /dev ... /var" (bash 以外)または "/var" (bash) だから、*/?? を削除するとどちらの場合も "r" の1文字が残る。もし /web やら /www やらのようなディレクトリが存在する環境で実行すると、/var ではなく /web (/www) がの末尾1文字になってしまってうまく動かない。

_ この "r" を使って /???/???/?r という引数で再度関数を呼ぶ。複数のファイルにマッチし、内容も環境によって異なるけど、最後にマッチするのはどの環境でもたいてい /usr/bin/tr か /usr/man/tr のどちらかのはず。次の行で ${_##*/} としているので tr だけが残る。これもマッチしたパスのリストの最後が tr でないと動かない。

_ さらに2回目の関数呼び出しは ! が前置されているので、終了ステータスすなわち $? が 1 になる。また、引数なしで実行される前提なので、$# は 0。よって、"\\$?$?$#" は \110 であり、これは octal で "H" の ascii コードをあらわす。

_ 結果として、最後に実行されるコマンドは、以下のように tr にヒアドキュメントを食わせるだけのものになる。

tr '#-1:-@[-_' '\110,_-{' <<_
#+::=$ _=@:*!
_
実行すると、Hello, world! になる。この引数をうまいことやるともっと縮みそうだけどどうだろう???

_ 今回は /??? から r の1文字を拾い、そこから /???/???/?r で tr を作るという二段構成でやっているが、 先日のもっと短いけど Linux でしか動かないものは、/????/$$/../*-* というワイルドカードで /proc/<pid>/../sysrq-trigger にマッチさせ、そこに含まれる tr という文字列を直接拾っている。また、bash を前提としてるので関数を定義していない。


2019年3月4日(月)

記号だけで Hello, world!

_ 記号シェルスクリプトで最短を目指す。

_ 標準出力に Hello, world! を吐くという結果だけ見れば最短だけど、標準エラー出力にエラー、警告が出るもの。77バイト(最終行は改行なし)。

 /*/$$/../*-*;! : ${_#*-}
 ${_%?????} \#-$?:-@[-_ \\$?$?$#,_-{<<_
 #+::=$ _=@:*!
標準エラー出力によけいなものを出さないもの。80バイト。
 : /*/$$/../*-*;! : ${_#*-}
 ${_%?????} \#-$?:-@[-_ \\$?$?$#,_-{<<<'#+::=$ _=@:*!'

_ ただし、激しく環境依存。

手元の環境では、CentOS5-7、Debian7 で動いてる。

_ 何をやってるのかは bash -x で実行すればすぐにわかると思うので解説しません。わかんない人は man bash と man ascii を読んでください。

_ 参考:

ruby より短かい!


2019年2月13日(水)

韓国ブロッキング

_ もう2月だけど今年一発目なのでいちおう、明けましておめでとうございます。別に忙しかったとか体を壊したとかじゃなく、ただ家に帰ってコタツに入った瞬間にすべてのやる気が失われていただけです(なので今日は仕事中に書いてる)。

_ で、 韓国で HTTPS なサイトのブロッキングが始まったとのこと。なんか艦これが巻き添えくらったらしく、DMM はせっかく FANZA と分離したんだし分離以前も dmm.co.jp と dmm.com でエロと非エロを分けてたのにとんだとばっちりだよな。

_ 今回の件は 昨年5月には検討が始まっていて( 翻訳)、 反対運動( 翻訳)も起きていた。日本の海賊版ブロッキング議論も昨年春からで、ほぼ同時期に似たような騒動が起きたので気になってたんだけど、結局実施に至ってしまったらしい。twitter の #SaveTheInternetKRという反対運動タグを見ると、とーぜんハングルばっかりなんだけど、海外に向けて日本語英語などで発信する tweet もちらほら見かける。

_ 韓国に通信の秘密がないわけではない。まったく逆で、日本と同じように憲法と業法で保護されてる上に、加えて通信秘密保護法なる法律まで整備された3階建てな構成で、見かけ上は日本よりも厳重に保護されていることになっている( 参考)。が、例外を認める規定があちこちにあって、以前からブロッキングが実施されていた。今回は SNI ブロッキングにより HTTPS なサイトまで対象にするよう範囲が拡大されたという認識。

_ SNI は TLS のネゴシエーション中にあらわれる情報だけど、これは TLS でありながら暗号化されておらず平文でやりとりされるので、経路上で他の通信からこれだけ選別してブロックできちゃう。SNI 以外の情報は暗号化されてるんで、URL のパス部分や HTTP body でのブロッキングはできず、できるのはサーバ名によるブロッキングだけ、DNS ブロッキングと大差ない。public DNS で DNS ブロッキングを回避しても SNI ブロッキングからは回避できないというのが大きな違い(VPN で回避できるはず)。

_ いちおう TLS 1.3 の extension として encrypted SNIも検討されてるけど、また RFC にはなってないしブラウザの実装もまだなんで、当分の間は SNI ブロッキングは有効。

_ なんで SNI が平文でやりとりされるかというと、平文じゃないとネゴシエーションできないからであって、じゃあなんで encrypted SNI なんてのが実現可能なのかというと、ESNI を復号するための鍵を TLS のネゴシエーションとは別のところから入手するから。それはどこにあるかというと DNS の _esni.example.com というところに置くことになっていて、つまり名前解決が平文 DNS なら結局ブロッキングされておしまいだよなー、public DNS over TLS/HTTPS 以外の解決策はないなー、という世界が待ってるわけで、そうなれば著名な public DNS の IP アドレスをブロッキングしてやればディストピアの完成であります。

_ 前述のように、韓国でも通信の秘密は憲法や法律でちゃんと保護されているはずだが、例外を認めたためにそれがどんどん拡大してついに有名無実化してしまった。日本でも、児童ポルノブロッキングという蟻の一穴はすでに開けられてしまっている。韓国と同じ轍を踏んで穴を拡大させて堤防を決壊させることのないよう、なんとか踏みとどまらなければならぬ。

ドメイン名差し止め

_ もう先月の記事なんだけど、ブロッキングに関連してついでに、 海賊版サイト問題の解決を阻む「防弾ホスティング」 その歴史から現在までを読み解くという記事。これの 3ページ目で GMO のレジストラ事業が防弾ホスティング扱いされてんだけど、うーん、という感じ。

_ この記事で GMO に突撃してる レジットスクリプトって不正なネット薬局(ドラッグとかのヤバい薬じゃなくて、処方薬の処方箋なしの販売とか未承認薬の宣伝とかが大半)を潰してまわるという事業を手がける会社なんだけど、その業務としてドメインを閉鎖させるとかいうことをやってるんだよね。 このへんとか詳しい。

_ ただ、ネット薬局とレジットスクリプトの間には直接の利害関係はなく、たとえ違法であろうと民間企業が主導してドメインを閉鎖させる根拠は薄い。公的事業として違法ネット薬局のパトロールを厚労省から委託されていた時期があったようだけど(たぶん今も続いてるんじゃないかと思うけど未確認)、販売なり宣伝なりが止まれば違法状態を脱するわけだから、厚労省にしたってドメイン閉鎖させるところまで持っていく権限はないはず。

_ その 厚労省のネット監視事業の資料を見ると「医薬品等のインターネット監視体制事業におけるウェブサイト閉鎖件数」として平成26年度からの3年でそれぞれ219件、1942件、316件という実績が記載されてたりなんかする。けっこう多い。この数字は web サイトの閉鎖件数なんでドメイン閉鎖まで至ったものがどの程度含まれてるのかは不明だけど、GMO 以外のレジストラは閉鎖に応じてるとレジットスクリプト自身が表明してる以上ゼロということはないはず。

_ つーか、ドメイン名の使用差し止めを命じられるような法律って日本にあるの? いちおう、不正競争防止法2条1項13号で

十三 不正の利益を得る目的で、又は他人に損害を加える目的で、他人の特定商品等表示(人の業務に係る氏名、商号、商標、標章その他の商品又は役務を表示するものをいう。)と同一若しくは類似のドメイン名を使用する権利を取得し、若しくは保有し、又はそのドメイン名を使用する行為
…を不正競争として規制してることは知ってる。が、これはドメイン名が他人の商標やらそういうものと同じだったり似てたりすることがダメなのであって、同一でも類似でもないドメイン名で不法行為をおこなう場合に適用されるものではない。各レジストリの DRP (紛争処理方針)もドメイン名の文字列自体が対象で、そのドメインの利用形態は対象にしていない。そういうドメイン名それ自体の不正利用ではなく、不法行為を止めるためにドメイン名の利用を差し止めることができる法律って存在しないという認識なんだけどあってる?

_ ということで自分の認識としては、レジットスクリプトの閉鎖要請に応じない GMO が悪いのではなく、そんな権利もないのに要請してそれが通ると思う方がおかしいと思ってる。防弾ホスティングと呼ばれようと GMO にはこれからもがんばって閉鎖要請を蹴とばしてもらいたい。不正サイトをなくしたいという思いを否定するつもりはないんだけど、そのためなら何をしてもいいという歪んだ正義感の暴走を感じるんだよねぇ。

_ なお、レジストラ経由でドメインを閉鎖させること自体に反対しているわけではない。まったく逆で、ちゃんと法的手続きを整備して正当に差し止めできるようにすべきという立場。ルールがないのにやるのがダメというだけ。ICANN も 法的な手続きを踏めばおっけーと言ってるし、アメリカだと マルウェアが使ってるドメインの差し押さえとかで活用されてる。

_ 自分がレジットスクリプトのことを知ったのって、昨年海賊版サイトをどうすんだという議論が沸騰してたときに、その対策手段としてのドメイン名差し止めを調査してたときなんだよね。なんで先月の記事を今さらひっぱりだしてきてこんなこと書いてるかというと、韓国のブロッキングもあるし、違法ダウンロードの範囲拡大とかいう話もまた盛り上がってきたから。だいぶ前に音楽動画のダウンロード違法化やったけどその後ひとつも立件されてないじゃん。実効性のない法律(でも別件逮捕には有用)を作ってどうすんのさ。ちゃんと海賊版を配布する行為を止められるようにしないと。

_ ドメイン名の差し止めって、ブロッキング合法化もダウンロード違法化拡大もせずに海賊版サイトを潰せるんで、そろそろちゃんと検討していいころだと思うんだけど、そういう話は聞かないんだよなぁ。プロバイダ責任法を改正してレジストラに対して送信防止措置(=ドメイン使用差し止め)と発信者情報開示を認めるようにすればいけそうな気がするんだけど。


3月中旬
やまや