システムの裏口を作って鍵をかけておくためのSBD(Secure Back Door)

 適切に設定されたSSHサービスはサーバへのリモート接続を安全にしてくれるが、SSHサーバがマシン上で常に動いているということ自体がそもそも好ましくないという場合もあるかもしれない。SBD(Secure Back Door)を使うと、サーバへの暗号化した接続をオープンして、例えばSSHサービスの起動やウェブサーバの起動やマシンの再起動などといったオペレーティングシステムに対する任意のコマンドをリモートから実行することができるようになる。

 SBDでは好きなポート番号を使用することができるが、ポート番号を指定しない場合のデフォルトは31415番ポートとなっている。通信には、SBDプロトコルを使用する。SBDプロトコルでは、データの改竄がないことと出所の信頼性を証明するために、ワンタイムパッド共通鍵とHMAC(keyed-hash message authentication code)を使用している。システムがリモートからのコマンドを受け付けるためには、クライアントとサーバが同一の鍵を持っている必要がある。なお鍵は単にランダムに生成された文字列を含む同一のファイルであり、このファイルは一度作成するだけで良いが、作成後は機密扱いにする必要がある。

設定と使用方法

 SBDの最新安定版であるSBD 0.5は2005年2月にリリースされたものだが、必要な機能はすべて使えるようになっている。まずはソースコードのtarファイルをダウンロードし、以下のように/usr/localなどのディレクトリでパッケージを展開し、ルート権限でコンパイルしてバイナリファイルを作成する。

~# cd /usr/local/
~# tar xvfz sbd-0.5.tar.gz
~# cd sbd
~# g++ -Wall -O2 -o sbdd ssocket.cpp sha1.cpp utils.cpp sbdd.cpp
~# g++ -Wall -O2 -o sbd csocket.cpp sha1.cpp utils.cpp sbd.cpp

 バイナリファイルの作成には、C++ コンパイラが必要となる。SBDのコンパイルと使用法について詳しくは、展開先のディレクトリ内に含まれているREADMEファイルを参照してほしい。

 クライアントからのリモートコマンドをサーバマシン上で実行することができるようにするためには、2つの同一のファイルを作成する必要がある。すなわちクライアント用のenckey.bitsファイルと、サーバ用のdeckey.bitsファイルだ。これらのファイルを作成するには、空のファイルの中に文字列をランダムに入力してenckey.bitsとして保存し、それをdeckey.bitsとしてコピーするだけで良い。ファイル内の文字列の大きさに特に制限はないが、文字列はできるだけ長い方が望ましいだろう。

 展開先のディレクトリ内には、ランダムな文字列を含むathkey.bitsというサーバ用のファイルも存在する。athkey.bitsは、クライアントの認証時に単純なIPスプーフィング対策のために使用される。元からファイル内に含まれている文字列はテスト用のため、enckey.bitsやdeckey.bitsと同様の方法で自分で生成したランダム文字列に入れ替える必要がある。

 サーバ側の準備が整ったら次に、クライアントマシンにSBDのクライアント用のバイナリファイルとenckey.bitsファイルをインストールする。その際、まずは先ほどサーバ上でコンパイルしたコンパイル済みのsbdバイナリをクライアント上で実行できるかどうか試してみて、それが失敗したらクライアント上でのバイナリファイルの構築を行なうようにすると良いだろう。

 以上が完了したらSBDサーバを起動することができる。例えば12345番のポート上でSBDサーバを起動するには、コマンドラインで./sbdd 12345と実行する。

 リモートのクライアントマシンからSSHサーバを起動するには、以下のコマンドを実行する。

~$ ./sbd server.IP.address 12345 "/etc/init.d/ssh start"

 ただしserver.IP.addressのところには、実際のサーバのアドレスを入れるようにする。すべてを適切に行なうことができていれば、クライアントマシンには次のような表示が出るはずだ。

Sent: 41 bytes

 なおSBDでは上記のような分かりにくいメッセージが表示されるだけなので、サーバ上でSSHサービスが実際に起動できたかどうかを確認するためには、サーバの/var/log/syslogで確認することをお勧めする。

 クライアントとサーバのセキュリティ鍵が一致しなかった場合には、以下のようなエラーが出るはずだ。

sbd: utils.cpp:171: void ComputHMACSHA1Hash(unsigned char*, size_t, char*, size_t,
unsigned char*): Assertion `secret_siz Aborted (core dumped)

 またSBDサーバが起動していなかったり、誤ったポート番号に接続しようとしたりした場合には以下のようなエラーが表示されるだろう。

Error! Could not connect!

 SBDを使うと、SBDサーバを起動しているマシンにログインしたときとまったく同様に、リモートからほぼあらゆるコマンドを実行することができる。SBDを例えばSSHなどの代わりに起動しておくことにより、攻撃を受けやすいサービスがネットワーク上で常に露出したままになることを避けることができる。稀にしか利用しないサービスは、必要になったときにだけ起動するようにするのは良い習慣だ。SBDは、システムのセキュリティについての心配事を減らしてくれるだろう。

NewsForge.com 原文