セキュリティを楽しく学ぶ、触れる。セキュリティごった煮ブログ

ネットエージェント
セキュリティごった煮ブログ

 コース:元祖こってり

「元祖こってり」記事はネットエージェント旧ブログ[netagent-blog.jp]に掲載されていた記事であり、現在ネットエージェントに在籍していないライターの記事も含みます。

軽量トランスポートセキュリティ CurveCP を試す

山口尋久

 こんにちは、ネットエージェント株式会社、大阪支社の山口です。
 地震の被害、影響により当ブログの更新が 2~3 週間ほど滞っていましたが、本日より、2 週間に 1 回というこれまでとは少し頻度を抑えた形ではありますが、更新を再開させていただこうと思います。また繰り返しになりますが、被害を受けられました皆様に心よりお見舞い申し上げますと共に、東北地方を始めとした東日本全体の一日も早い復旧を心よりお祈り致します。

 さて、今回は、前回紹介した DNSCurve の暗号化部分を一般化した実装 CurveCP のα版実装をのぞいてみたいと思います。

-----

 CurveCPDNSCurve で使われているトランスポート層のセキュリティ拡張プロトコルを DNS 以外の通信にも拡張すべく、現在開発中のプロトコルです。CurveCP を利用したアプリケーションはまだないようですが、パケット構成やメッセージフォーマットを確認できる実装が公開されています。私も少し触ってみたので、その導入手順を以下に記します。
 まず NaCl(Networking and Cryptography library) ライブラリをダウンロードして展開・ビルドします。本稿執筆時点でのバージョンは 20110221 でした。

$ wget http://hyperelliptic.org/nacl/nacl-20110221.tar.bz2
$ bzcat nacl-20110221.tar.bz2 | tar xf -
$ cd nacl-20110221
$ ./do

 今回は動作を試すだけなので、ビルドしたディレクトリのままで使います。サーバ用(192.0.2.1)とクライアント用(192.0.2.2)に 2 台同じ設定で用意しました。

$ export PATH=${PATH}:`pwd`/build/`hostname -s`/bin
$ mkdir -p ~/tmp/curvecp
$ cd ~/tmp/curvecp

 サーバ側の鍵を生成します。

$ curvecpmakekey serverkey
$ ls -AFR serverkey
.expertsonly/ publickey

serverkey/.expertsonly:
lock noncecounter noncekey secretkey

 サーバ側の公開鍵をクライアントへコピーします。

$ curvecpprintkey serverkey > serverkey.hex
$ scp serverkey.hex 192.0.2.2:~/tmp/curvecp

 用意ができたので実際に通信をしましょう。今回試したα版では、通信前の準備などを行うパケット構成と、実際に送受信するデータの整形を行うメッセージ構成にそれぞれコマンドが用意されています。コマンドフォーマットは以下になります。

 □curvecpserverサーバ側パケット構成プログラム
  -snameサーバ名
  -keydirサーバ側鍵を保持するディレクトリ
  -ipaddrIPアドレス
  -portポート番号
  -extこの通信の識別用サーバ側拡張文字列
  -progクライアント接続時に実行するプログラム

 □curvecpclientクライアント側パケット構成プログラム
  -snameサーバ名
  -pubkeyサーバ側の公開鍵(文字列)
  -ipaddrIPアドレス
  -portポート番号
  -extこの通信の識別用サーバ側拡張文字列
  -prog接続時に実行するプログラム

 □curvecpmessageクライアント側パケット構成プログラム
  -prog通信時に実行するプログラム

 curvecpserver を使い、サーバ側で date コマンドを実行するよう待ち受け設定します。

$ curvecpserver server.example.com serverkey 192.0.2.1 10000 [折返し]
12345678901234567890123456789012 curvecpmessage date

 次にクライアント側で、サーバから送られてきた内容を表示するコマンド(curvecpclient)を実行します。

$ curvecpclient server.example.com $(cat serverkey.hex) [折返し]
192.0.2.1 10000 12345678901234567890123456789012 [折返し]
curvecpmessage -c sh -c 'cat <&6'

 実行結果をキャプチャしたものを curvecp_tcplog.txt に置いておきますので興味があればぜひ見てみてください。パケットフォーマットなどが確認できます。

-----

 今回 CurveCP のサンプル実装を実行してみました。公開鍵文字列と、鍵と対になるサーバ側の拡張文字列が事前にクライアント側へ渡っていれば暗号化通信が可能になります。暗号化通信の特徴が分かったからといって中身を閲覧できるわけではありませんが、参考になればということで紹介いたしました。

メルマガ読者募集 採用情報 2020年卒向けインターンシップ

月別