FOSSユーティリティを用いたセキュアなWi-Fi接続の確立

先日のSlashdotの記事ではWi-Fi接続のセキュリティが取り上げられていたが、これはデフォルトで用いられているWi-Fi暗号プロトコルの脆弱性および、暗号化の施されていないパブリックWi-Fi接続に潜む危険性を再確認するよい機会であった。だが幸いなことに、いくつかのFOSSユーティリティを利用することで、Wi-Fi接続セッションを安全にトンネルさせて、Webおよび電子メールのトラフィックを防護することができるのである。

Wi-Fiトラフィックに暗号化を施すには、まず最初にダイナミックDNSサービスをセットアップして、外出時にもサーバへのアクセスをできるようにしておく。次に、自宅にあるサーバを鍵認証された接続のみを受け付けるよう設定し、SSH接続を自宅のルータ経由でこのSSHサーバにポートフォワードさせるようにする。こうした環境を整えておくと、リモートクライアントから出される電子メールおよびWebのトラフィックを、暗号化したSSHトンネル経由でいったん自宅のネットワークに転送させ、そこから改めてインターネットに接続させることができるのである。

ここでは、使用するラップトップにSSHクライアントが既にインストールされていること、自宅のホームネットワークのLinuxサーバでsshdデーモンが起動していること、サーバのiptablesベースのソフトウェアファイアウォールはSSH接続が行えるように設定されていることを前提として話を進める。

なお私のネットワーク環境を説明しておくと、自宅ではゲートウェイルータとしてLinksys WRT54G Wireless-G Routerを使用しており、ホームネットワークにあるCentOS 4サーバではSSHデーモン、ラップトップマシンではUbuntu Dapper Drakeをそれぞれ実行させている。またラップトップで使用しているWebブラウザはFirefox、電子メールクライアントはThunderbirdである。

外出先からSSHサーバにアクセスするための準備

たいていのISPであれば、在宅カスタマ用にダイナミックIPアドレスを提供しているはずであるが、外出先からのインターネット接続を確立する場合は、このアドレスの扱いが1つの問題となる。ダイナミックDNSの指定するドメイン名は、常に自宅に設置されたサーバをポイントするからである。ダイナミックDNSを使用するのであれば、低料金のもので構わないので、適当な登録機関を見つけてインターネットドメインを登録しておく必要がある。私の場合使用しているのはGoDaddyだが、ここは取得ドメインに関するDNSサーバのプロパティ変更を簡単に行えるのが特長だ。ダイナミックDNSサービスについては、サービスとサポートの信頼性で定評のあるZoneEditを以前から使用している。なおZoneEditで提供されるDNSサービスでは、トラフィックレベルが超過しない限り、5つまでのドメインを無料で使用することができる。

ダイナミックDNSを初めて導入するにあたっての詳細についてはLinux.comに以前に掲載された記事を参照して頂きたい。

SSHクライアントおよびサーバの設定

SSHサーバをインターネットに接続する場合は、ユーザ名/パスワードに対する自動スキャン式のブルートフォースアタックを受けることを覚悟しなければならないので、その前にいくつかの設定変更を施して、SSH接続を公開鍵/秘密鍵の交換をした者のみに制限させ、当て推量で解読されるようなユーザ名/パスワードのログイン情報は削除しておく。これは簡単な設定変更だが、一般的にSSHアクセスを単純化させる効果もある。

最初に、SSHサーバとの接続に使うラップトップ用の公開鍵/秘密鍵のペアを作成しておく。それには、ラップトップにログインして、ユーザプロンプトから下記のコマンドを入力する。

ssh-keygen -t dsa

これにより、SSHサーバとの接続に使う公開鍵/秘密鍵のペアが作成される。この場合、鍵の格納先は/home/user/.sshディレクトリである。

次に、SSHサーバの指定ファイルに対して、ユーザ用の公開鍵を追加する。そのための準備として、SSHサーバにユーザ用のアカウントを作成してから、下記のコマンドを用いて、当該アカウントのhomeディレクトリ内に必要なディレクトリとファイルを作成しておく。

mkdir .ssh
touch .ssh/authorized_keys

ユーザ用の公開鍵をファイルに割り当てるには、ラップトップ上でSSHを使用するのが最も簡単である。

cat ~/.ssh/id_dsa.pub | ssh user@sshserver_ipaddress "cat >> .ssh/authorized_keys"

SSHサーバ上にあるファイルのパーミッションを、当該ユーザのみが読み取り可能なように変更する。

chmod 600 .ssh/authorized_keys

SSHサーバの設定ファイルを変更して、公開鍵/秘密鍵による接続のみが行えるようにする。CentOS 4の場合、設定ファイルは/etc/ssh/sshd_configである。なおこの作業を行う際には、設定ミスによりアクセス不可能になる危険性があるので、事前に設定ファイルのバックアップ用コピーの作成および、サーバへのコンソールアクセスを確立しておく。ルート権限で設定ファイルを開き、必要な変更ないし追加を施して、ファイルの有効行が下記のコードだけとなるよう、それ以外の行はすべてコメント化しておく。

#ポート 22
Protocol 2

# プロトコルバージョン2用ホストキー
HostKey /etc/ssh/ssh_host_dsa_key

# ログイン
SyslogFacility AUTHPRIV

# 認証
PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# トンネルされたクリアテキストパスワードを無効化させるため、ここの設定をnoに変更!
PasswordAuthentication no

ChallengeResponseAuthentication no

UsePAM no

AllowTcpForwarding yes

GatewayPorts yes

TCPKeepAlive yes

Compression yes

# サブシステムが無い場合のデフォルトをオーバライド
Subsystem sftp /usr/libexec/openssh/sftp-server

ルート権限でSSHサーバをリスタートさせる。

service sshd restart

ラップトップ側から接続できることを確認する。

ssh user@sshserver_ipaddress

この場合の接続は自動処理され、その際にパスワード入力は求められないはずである。また、サーバ上に公開鍵を持たないユーザは接続できないこともテストしておく。

ssh smith@sshserver_ipaddress

この場合は、ユーザ名/パスワードの入力待ち状態に進まず、下記のメッセージが表示されるはずである。

Permission denied (publickey).

SSHサーバへの接続を許可する個々のクライアントに対して、上記の設定ステップを繰り返す。

SSHトラフィックの自宅サーバへのポートフォワード

Port forwarding

コマンドラインからssh yourdomain.com という構文のコマンドを送信すると、リモートSSHセッションが開始されるが、その際にはDNSルックアップがダイナミックDNSのプロバイダにあるDNSサーバに対して行われて、対応するカレントのIPアドレスが返されてくるはずである。よってこのSSH接続のリクエストは、自宅のホームネットワークにあるゲートウェイルータに転送され、ホームネットワーク上の該当するコンピュータにフォワードされることになる。

次にゲートウェイルータにポートフォワード用の設定を施すが、通常この操作は、ホームネットワーク上でブラウザ形式の設定アプリケーションを用いて行うのが普通である。例えば私が使用しているLinksysルータの場合、Applications & Gamingというメニュー項目からポートフォワード用の設定にアクセスできる。デフォルトでSSHトラフィックに割り当てられているポートは22である。このポート22に到達したインバウンド(内向き)トラフィックは、すべてホームネットワーク上でSSHデーモンを実行しているコンピュータのIPアドレスにフォワードされるようにしておく。クライアントにレスポンスを返す際には、当該リクエストを出したクライアントが誰であるかをルータに判定させる。掲載した図面は、私が使用しているLinksys WRT54Gでの設定画面である。

次に、暗号化トンネルのセットアップを行う。それにはまず、ラップトップ側でのコマンドライン操作により、下記の構文のコマンドを送信して暗号化接続を確立する。

ssh -D 2000 yourdomainname.com

この構文における-D 2000は、ラップトップのポート2000に対する固定接続のリスニングを指定するためのスイッチである。接続が確立したかをテストする。なおこのコマンドは、bashスクリプトに記述しておくことで、ラップトップのメニューバーからもアクセスできるはずである。

トンネル経由でトラフィックをフォワードさせるためのアプリケーション設定

SOCKS

接続が正常に確立されたら、それを使用するための設定をアプリケーション側に施す。FirefoxおよびThunderbirdの場合は、いずれもEdit -> Preferences -> Connection Settingsというメニュー項目を選択する。manual proxy configurationのラジオボタンを選択して、SOCKS Hostのセクションをlocalhost、Portを2000と設定する。掲載した図面は、私の環境における設定画面である。

必要な設定は、これだけである。この設定により私のラップトップにあるThunderbirdおよびFirefoxのトラフィックは、ポート2000をリスニングするSSHクライアントにフォワードされてから、暗号化トンネル経由でホームネットワークにあるSSHサーバに送信された後、自宅のルータを介してインターネットにフォワードされるはずである。この接続法を用いるその他のメリットとして、ISPから見る限り、こうしたラップトップは自宅から接続しているのと変わらないので、電子メールから出されるアウトバウンド(外向き)トラフィックのアクセス先がこのISPにあるSMTPサーバとなることが挙げられる。もはや外出先からのアクセスであっても、Wi-Fiトラフィックの盗聴を企てるクラッカー連中の存在を気にする必要はない。

NewsForge.com 原文