EMIT-Japan WebCT レター

  • 登録・解除
  • プライバシーポリシー

【管理者向けミニティップス】SSL経由でWebCTを利用する

httpでは基本的に平文でデータをやりとりします。
これによりクライアントからサーバの間の経路でデータ(パケット)を監視されたりするといとも簡単に通信内容をみられる可能性があります。

パケットを監視した例

(WebCT_ID=test&Password=testというリクエストを監視することによりid/passともにtestでログインしている事が解る)

(略)
26:8900..Content-Length: 143..Connection: Keep-Alive..Cache-Control: no-cac
he..Cookie: WebCTTicket=....request_uri=%2Fwebct%2Fhomearea%2Fhomearea%3F&a
ction=webform_user&WebCT_ID=test&Password=test&submitbutton=%E3%83%AD%E3%82
%B0%E3%82%A4%E3%83%B3

実際WebCTの中には重要な成績データやテストデータ等が収められていますので、なるべくこれらの情報を暗号化して安全に利用したい所です。

今回は経路を暗号化する為にSSLをWebCTに組みこむ方法を解説します。

SSLで行う事

SSLは主に以下の2点に関しての役割を負います

  1. 経路を暗号化して流れている情報を簡単に取得できないようにする
  2. 接続先サーバが正しい事を証明する。

1.は良いとして2に関しては接続先のurlが経路書き換え等により実は別のサーバに接続していた等の攻撃に対して有効です。しかし、サーバが正しい事を証明するにはしかるべき機関(CAと呼びます)に証明書を発行してもらう必要があります。これは年間おおよそ5万前後の費用が発生しますので注意してください。

なお、経路の暗号化のみを行いたい場合は、証明書に対して自分で署名する事も可能です。

また、SSLの組み込みは以下の手順で行います。

サーバ鍵の生成

SSLを実装するためにはopensslというコマンドを利用します。既にシステムにopensslが組み込まれていればそれを利用しても良いですが、WebCTにはopensslのバイナリがバンドルされているので、そちらを利用する方法もあります。
今回はバンドル版opensslで作業をすすめます。

まず、$webct_root/webct/server/bin/ に cdします(以降、WebCTをインストールしたディレクトリを$webct_rootと表記します)。

cd webct_root/webct/server/bin/

このディレクトリ以下にopensslコマンドが格納されています。

まず以下のようにして暗号化された鍵を生成します。

./openssl genrsa -des3 -out server.key.secure 1024
warning, not much extra random data, consider using the -rand option
Generating RSA private key, 1024 bit long modulus
...........++++++
.......................................++++++
e is 65537 (0x10001)
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:

PEMパスワードの入力が求められますので適当なパスワードを2度入力します。

これでserver.key.secureが生成されたことを確認してください。

鍵からパスワードを抜きとる

さきほど生成したパスワード付きの鍵を利用しても良いのですが、WebCTサーバを起動するたびに先程入力したパスワードを求められます。これは管理上問題になる事が多いので、以下のようにして鍵からパスワードを抜き取ります。

./openssl rsa -in server.key.secure -out server.key
read RSA key
Enter PEM pass phrase:
writing RSA key

パスワードの入力が求められます。ここで先程入力したPEMパスワードを入力する事でserver.keyが生成されます。

署名要求の作成

この鍵からCSRと呼ばれる署名要求を生成します。実際の署名機関(CA)に提出するのはこのCSRファイルになります。Verisign等のCAに署名してもらうのであれば一度そちらのページの解説を読んでどのように署名要求を入力すれば良いのか調べてみてください。

署名要求を作成するには以下のように行います。

./openssl req -config ../openssl.cnf -new -key server.key -out server.csr

サーバに関する様々な情報の入力を求められるので、入力します。
Common Nameだけは気をつけてください。これはユーザが実際にアクセスするサーバのFQDNを入力する必要があります(例 www.emit-japan.com 等)

これによりserver.csrが出来ました。これをしかるべき署名機関に提出し、crtファイルをもらいます。

自己署名するとき

署名要求をしかるべき署名機関ではなく、自分で署名する事も出来ます。これを行うにはLocalCAを生成する必要があります。以下のようにディレクトリを構成します

mkdir demoCA
mkdir demoCA/certs
mkdir demoCA/crl
mkdir demoCA/newcerts
mkdir demoCA/private
echo 01 > demoCA/serial
touch demoCA/index.txt

最終的に以下のようなディレクトリツリーが構成されていればOKです。

demoCA/
|-- certs
|-- crl
|-- index.txt
|-- newcerts
|-- private
`-- serial

CA自身の情報を登録するために以下のようなコマンドを入力します。

./openssl req -config ../openssl.cnf -new -x509 -keyout demoCA/private/cakey.pem  -out demoCA/cacert.pem

署名要求を生成した時のようにいろいろ聞かれますが、適当に入力します。またパスワードの入力を求められます。ここで入力したパスワードは忘れないようにしてください。

では実際にserver.csrに対して自己署名を行いserver.crtを生成してみましょう。

 ./openssl ca -config ../openssl.cnf -policy policy_anything -out server.crt -infiles server.csr

ここでCAを登録した時のパスワードを求められるのでそれを入力します。また署名要求に関する情報の一覧が見られます。自己署名なので適当に確認した後yを入力して署名を完了します。するとserver.crtが生成されているはずです。

WebCTサーバへのSSL設定

今までの手順を踏まえると以下の3つのファイルが存在しているはずです。

server.key
一番最初に生成したサーバの鍵
server.csr
署名要求ファイル
server.crt
署名済ファイル

ここで必要になるのはserver.keyおよびserver.crtの2点です。署名要求ファイルはcrtを入手してしまえばもう必要はありません。(CAによってはchainファイルも送ってくる事があります。)

まず、server.keyおよびserver.crt$webct_root/webct/server/conf/ssl以下に移動させます

mv server.key server.crt $/webct_root/webct/server/conf/ssl/

(chainファイルを与えられた場合は同様にserver/conf/ssl内にca.crtとして格納してください)

続いて現在稼働中のWebCTサーバを停止させます。

$webct_root/webct/webctctl stop

続いてhttpd.confを書き換えます。

以下のディレクトリにまずcdします。

cd $webct_root/webct/server/conf/

httpd.confを任意のエディタで編集します。

vi httpd.conf

#LoadModule ssl_module modules/mod_ssl.so となっている部分があるので、このコメントを削除して有効化します。

#LoadModule ssl_module modules/mod_ssl.so
LoadModule ssl_module modules/mod_ssl.so

以上で設定は終了ですが、もしchainファイルを与えられた場合はSSLCertificateChainFileの行のコメントも削除してください。

SSLCertificateChainFile /home/webct/webct_root/webct/server/conf/ssl/ca.crt

起動

以上でSSLの設定は終了です。この後WebCTを起動しますが、ポート443を利用するため起動にはroot権限が必要となるのに注意してください。

su
$webct_root/webct/webctctl start

尚、自己署名した証明書では「このセキュリティ証明書は信頼する会社から発行されていません」という警告が出ます。実際には信頼できるCAに署名を受けたcrtを組みこむ事が望ましいですが金銭的その他の問題でこれが行えない場合は以下の手順でクライアント証明書を発行し、各クライアントにこの証明書をインストールしてもらう事でこの制限を回避する事も可能です。

クライアント証明書の発行

生成したdemoCA内にあるcacert.pemを任意のWebでアクセスできる場所に配置するだけでOKです。WebCTを利用して配布するには$webct_root/webct/users以下に置けばOKです。

cp $webct_root/webct/server/bin/demoCA/cacert.pem webct_root/webct/user/

またserver/conf/mime.typesに以下のように設定しておきます。

application/x-x509-ca-cert     der pem crt

これにより、例えば https://server/cacert.pem 等と指定させることにより、クライアントに証明書を配布する事が出来ます。

実際に通信内容が暗号化されているか調べる

適当なパケットキャプチャソフトで念のため確認してみると良いかもしれません。

T 192.168.201.236:3426 -> 192.168.201.226:443 [AP]
  ....95..p..R.8..[0S=..X..F...8u'....k....-....d_kLR...3=....Sc6a..s...O..1,
  .......|.......b.V7.p.<G.y#V....3;$.$E......{.....:fR.|.y.J....>..{:...Owm~
  .]...&..~.~.e....uD"6|s.iP...I>....i.a.x.!.....o...\...._.)z.5k)#\......M..
  *.q..72.V....... z.............N..u.wDI\P.i........`.....pIB^.j..w...)...=E
  -.k..c..w,.T&...#A.Rl.:'...=.T-.t..&d9..mv...6<).%.i..=m.XXX.Q..R&..t.4....
  ..;'.BS.8.b.....Q.2.hO~.i....[.....y..........dh...".4-...A.._.~......Y...V
  V..^]..$.9.......a.d.t.v.......i.?...a>B>...,...2.}=.=...4..z.3B~..E.XM."..
  ..yE0..n.J....eS.x^....xS..}.x.n".N..-.6.........

このように一目みただけでは全くわからない文字の羅列になっていればOKです。

文責: 福山貴幸
(2005年 2月)