fwknopと単一パケット認証(SPA)

 サーバをファイアウォールの背後に隠して保護することは、システム管理者にとってベストプラクティスだが、決して万全ではない。隠しておいても、nmapnessusといったネットワークスキャナを使えば見える。SMTPやHTTPのようなサービスには、当然、外部からのアクセスがあるし、社内限定のサーバであっても、出張中のスタッフによる社外からのアクセスがあったときは、これに応じなければならない。この問題に悩んでいる企業は、単一パケット認証のためのオープンソースユーティリティ、 fwknop を使用してみたらどうだろう。ネットワーク上のいたずらからサーバを保護するのにきっと役に立つ。

 単一パケット認証(SPA)は、2003年に使われはじめたポートノッキング手法の派生形である。Wikipediaでポートノッキングを調べると、「ファイアウォールで守られたポートを外部に向けて開く手法。前もって指定されている閉じたポートに対して一連の接続要求を行ったとき、その接続要求が正しい順序で受信されたと確認されると、ファイアウォール規則が動的に変更されて、接続要求を送ったホストが当該ポート(群)を通じて接続することを許される」と定義されている。

 単一パケット認証は、ポートノッキングの概念を単一パケットにまで煮詰めたものと言える。前もって指定されたポートに一連のパケットを送るのでなく、ペイロードはただ1つのパケットであり、その中に「ノック」がコード化されている。受信されたキーが正しければ、SPAアプリケーションがファイアウォール規則を変更して、認証されたホストへのアクセスを許可する。以下では、fwknop(FireWall KNock OPerator)のインストールとテストを通じて、この認証過程をたどってみることにしよう。

 fwknopは、Cypherdyne.orgのセキュリティ研究員であり、 Linux Firewalls の著者でもあるMichael Rash氏によって開発された。バイナリパッケージ、ソースパッケージ、tarballのどの形でもダウンロードできる。本稿では、アプリケーションの機能がよく理解できるよう、tarballを使ってソースからインストールする。

 fwknopをダウンロードしてインストールする前に、テスト用に2台のホストを用意しておく必要がある。1台が単一パケット認証クライアントとなり、もう1台がサーバとなる。サーバとして使うマシンについては、実運用マシンでないことを十分に確認しておくこと。すべてのSSH接続を明示的に拒否するようiptablesアクセスポリシーを設定するので、実運用マシンであってはならない。また、テストプラットフォームにはローカルマシンを使うことを強くお勧めする。ファイアウォールポリシーを強化したあとでリモートサーバへのアクセスを復活させることは、ときに困難な作業になりかねない。

 fwknopをダウンロードしたら、それを展開して、クライアントとサーバの両方にソースを抽出する。ほとんどのソースディストリビューションには./configureスクリプトがあって、これを通常の「configure, make, make install」手順に使うが、fwknopは異なる。install.plというPerlスクリプトを使い、これでアプリケーションをビルドし、インストールする。install.plが首尾よく実行されれば、動作可能なfwknopがインストールされているはずである。サーバへのfwknopインストールには、rootのアクセス権限が必要になる。root権限がないと、fwknopはサーバでなくクライアントとしてインストールされてしまい、単一パケット認証のテストを進めることができない。

 インストールしたfwknopのセットアップが正しいかどうか、./fwknop_test.plスクリプトで確かめよう。このスクリプトは、インストール先のtestサブディレクトリにある。筆者がCentOS 4搭載のDell PowerEdge 850サーバで実行したところ、121通りのテストをすべて終えるのに約4分かかった。テスト結果はログファイルに出力されるので、その場にいつづけなくても、エラーメッセージを見逃す心配はない。

 fwknopのアクセス制御ポリシーファイルはaccess.confと呼ばれ、fwknopサーバの/etc/fwknopに置かれている。今回のテストでは、認証キー以外にはデフォルトの設定を使う。/etc/fwknop/access.confを編集用に開き、ファイルの末尾までスキップする。KEY:で始まる行が見つかったら、少なくとも8文字からなる文字列をキーに指定する。本稿では”myt3stk3y!”を使った。

ドアのロック

 fwknopを首尾よくインストールできたら、いよいよサーバをロックする。デモを煩雑にしないため、ここではSSHアクセスを制限するだけにとどめよう。もちろん、fwknopははるかに大きな能力を秘めているので、深く知りたい方はRashのLinux Firewallsを参照してほしい。fwknopのインストールと配備について行き届いた説明がある。

 fwknopを配備する以前、SSHアクセスに関する筆者のiptablesポリシーは、「-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT」というものだった。クライアントからSSHサーバへの接続テストをしてみたところ、これでなんの問題もなかった。

[user@client-box]$ ssh 192.168.1.130
login as: user
user@192.168.1.130's password: xxxxxxxxxxx
Last login: Mon May  5 15:35:51 2008 from 192.168.1.129
[user@chipotle ~]$

 では、サーバのiptablesの設定を変えて、SSHアクセスを拒否しよう。自分自身をサーバから締め出してしまわないよう、十分注意してほしい。おそらく、アクセス設定の変更には、Red Hatのsystem-config-securityのようなコマンドラインユーティリティを使うシステム管理者がほとんどだろうが、本稿では設定を1つ変えるだけなので、テキストエディタを使う。

 /etc/sysconfig/iptablesを編集用に開き(ただし、root権限が必要)、--dport 22 -j ACCEPTで終わっている行を探す。これがSSHアクセスを制御している規則である。ACCEPTREJECTに変えて、ファイルを保存する。あとは、「/etc/init.d/iptables restart」コマンドでiptablesを再起動すれば、新しいポリシーが有効になる。

 では、クライアントからサーバへのSSHセッションを再度試み、変更結果をテストしてみよう。SSH接続要求が拒否され、「ssh: connect to host 192.168.1.130 port 22: Connection refused」のようなメッセージが出されるはずである。このメッセージが出ないときは、iptablesに加えた変更が正しかったかどうか、かつiptablesが首尾よく再起動されたかどうかを確認しよう。正しく再起動されないと、加えた変更が有効にならない。

ドアのアンロック

 SSHアクセスをブロックできたところで、次にfwknopを起動し、クライアントにアクセス権限を与えることにしよう。fwknopの起動方法は2通りあり、通常は「/etc/init.d/fwknop start」を使う。この場合、fwknopはデーモンモードになる。本稿では、fwknopのデバッグモードを利用してみる。それには、インストール先のディレクトリで「./fwknopd --d」コマンドを実行する。fwknopはファイアウォール規則のリストを書き出し、次のようなプロンプトを出す。
"Sniffing (promisc) packet data from interface: eth0
Wed May 7 10:39:57 2008 [+] pcap_loop()

 fwknopはパケットスニッフィングを開始し、認証キーが送られてくるのを待っている。

 クライアントマシンに行き、fwknopのインストール先ディレクトリに移動して、「./fwknop -A tcp/22 -k 192.168.1.130」を入力する(192.168.1.130は、fwknopサーバのIPアドレスで置き換える)。キーの入力を促すプロンプトが出るので、/etc/fwknop/access.confで指定しておいたキーを入力する。

 正しいキーをfwknopサーバに送ってから30秒以内に(この長さは、/etc/fwknop/access.confを編集して変えられる)SSH接続を働きかける。実際にやってみよう。

[user@client-box]$ ssh 192.168.1.130
login as: user
user@192.168.1.130's password: xxxxxxxxxxx
Last login: Mon May  5 15:39:51 2008 from 192.168.1.129
[user@chipotle ~]$

 見事、ログインできた。

 fwknopサーバに無事SSH接続できた読者には、おめでとう。これで、単一パケット認証を成功裏に配備できた。もしログインに失敗したという方がいたら、fwknopサーバからのデバッグ出力を読み、入力したアクセスキーが/etc/fwknop/access.confに指定されたキーと同じであることを確認してほしい。キー入力の誤りがエラーの最大原因である。

次は何を?

 本稿ではただ1つのサービスを扱っただけだが、fwknopの保護対象を広げるのは簡単な作業である。サービスを追加するには、/etc/fwknop/access.confでそのサービスを定義し、fwknopを再起動するだけでよい。

 fwknopは万能薬ではない。しかし、重要な資産に社外からアクセスする必要があるというシステムでは、システム隠しの有効な手段として一考に値する。悪人から家が見えなければ、ドアが打ち破られて侵入されることもない。

Bob Currierは、フロリダ州サラソタにあるMote Marine Laboratory社の主任データエンジニア。同社のLinuxサーバ群を管理し、自動潜水艇の運航制御コードを書いている。Linux.com、Network World、ZDnet.com、Smart Computingなど、数多くの業界紙誌に、100本を超える記事・書評・論評を寄稿している。

Linux.com 原文