|
今、重要な課題として挙げられるセキュリティの強化。なかでもデータの保護は最も重要です。
データベースは、データを効率的、かつ安全に保護・格納するための機能を備えています。しかし、データベースを利用する側の意識は、パフォーマンスの向上やフェイル・オー
バーなどに偏りがちで、データの安全性については最低限の状態となっている場合も少なくありません。そもそも、セキュリティを重点に考えた場合、データベースはどのような機能
を提供しているのでしょうか。
ネットワークにおけるセキュリティの進歩は、目覚しいものがあります。
たとえば、以前は当然のように利用していたtelnet、ftp、rlogin、rshなどのプロトコルやサービスは、今や過去の遺産となっている気がします。
そして、これらのセキュリティ・リスクの回避をすべく、SSHやVPNなどの普及が驚異的な勢いで進んでいます。
「で、データベースは?」 と、聞かれれば、データベースそれ自体が高度なセキュリティ機能をサポートしてきたにも関わらず、誰もが当然のように活用しているとはとてもいえな
い状況だと思います。
では、早速ですが、問題です。
☆ ☆
【問題】
|
インターネットによって商品の販売を行うショッピングサイトのデータベースに格納されるデータは、以下の手順でデータベースに格納されます。

この流れの中で、暗号化すべき部分はどこですか?
|
|
●暗号化の威力と必要性
データを守る方法としてもっとも効果的なものの1つが暗号化です。どんなに強固なシステムであっても、そのシステムに格納されるデータを使う以上、データとしては存在するわけ
ですから、そのデータが盗み見られる危険性も存在することになります。
ここで、もし盗み見られたとしても、意味がわからないように暗号化しておけば、苦労して盗み出して頂いた方には骨折り損のくたびれ儲けもご提供できます。データベースは、ソ
フトウェアを組み合わせて最終的にたどり着く「データの器」です。器に至るまでの経路の中で、データが盗聴される可能性がないとは言えません。
よって、すべての経路で暗号化すべきです。
ただし、(3)、(4)については、選択するソフトウェアによっては暗号化できない場合もあります。たとえば、httpサーバーからアプリケーション・サーバーまでの接続にAJP13プロト
コル*を使用している場合には、秘密鍵には対応していないなどの問題が発生します。一方、この間のプロトコルをhttpsで接続できれば、一貫した秘密鍵による暗号化ができることに
なる訳です。
つまり、システム設計時には、どこまで暗号化するのかを決定した上で、必要なソフトウェアを選択する必要があります。
*AJP13プロトコル
(http://www.jajakarta.org/tomcat/tomcat-jk2/ja/docs/common/AJPv13.html)
●暗号化の判断基準
続いて、(4)における暗号化について検証してみましょう。
まずは、この間を暗号化するか否かの選択から始まります。アプリケーション・サーバーとデータベースサーバーは社内にあるわけですから、このサーバー間は安全な社内LAN上にあ
り、この部分を暗号化する必要はないと考えることもできます。
また、暗号化と復号はCPUリソースの使用量の増加を伴います。その負荷を十分に検証したうえでなければ、暗号化の本番採用はできないというのも厄介な話です。社内からの情報漏
洩が問題になる昨今、社内LANだから安心とあぐらをかいているわけにはいきません。社内LANであっても暗号化を検討すべき、負荷テストをするべきということになります。
では実際に、Oracleを題材に暗号化の設定を見ていくことにします。Oracleでは、サーバー・クライアント間の接続はOracleNetを使って行います。まずは、クライアントのSQL*Plus
からOracleNetでデータベースサーバーに接続し、select文を発行した際にネットワークを流れるデータを確認してみます。これは、いたって簡単な作業です。ネットワーク管理ツール
の中には、パケットを監視し、そのデータの中身を見せてくれるものは山とありますからね(シェアウェアでもありますから、誰でも入手できるものとなりますし…)。
暗号化されていないパケットの例(一部抜粋)
|
73 65 6C 65 63 74 20 2a |select *| (一部抜粋)
20 66 72 6F 6D 20 63 73 | from cu|
70 74 6f 6d 65 72 20 20 |stomer |
77 68 65 72 65 20 75 73 |where us|
65 72 5f 69 64 20 3d 20 |er_id = |
|
|
大変わかりやすいですね……、つまり、データを盗み見られたら、個人情報が盗まれる可能性もあるということです。インターネット・ショッピングでの個人のカード番号がこんな
風に見られたら、大変です。
●暗号化の実際
では、ここで、Oracleデータベースを例に、Oracle NetのAdvanced Securityの設定をしてみましょう。
DBサーバー側のsqlnet.oraに以下の記述を行います。
|
#SQLNET.ORA - SERVER
sqlnet.crypto_seed="fewkpfrepgomrepogmropegjerpogjpejvvmmrpmfewkpfrepgomrepo"
sqlnet.encryption_server = required
sqlnet.encryption_types_server = (RC4_56)
|
|
クライアント側のsqlnet.oraに以下の記述を行います。
|
#SQLNET.ORA - CLIENT
sqlnet.crypto_seed="dsdfrpdstrpgrmmpbmprthmtpommbmptbmpotpredsdfrpdstrpgrmm"
sqlnet.encryption_client = required
sqlnet.encryption_types_client = (RC4_56)
|
|
暗号化設定したあとで、先ほどと同じように、SELECT文を実行したパケットを見てみましょう。
|
C1 FF 40 FE 4E 72 83 0D |..@.Nr..|(一部抜粋)
4E 7C 9B 3B A6 70 9C E9 |N|.;.p..|
E0 4E 5B A9 32 62 76 82 |.N[.2bv.|
5E 64 F5 4E DB 19 35 C3 |^d.N..5.|
5D 5B F4 BC 55 F3 68 0E |][..U.h.|
72 18 A2 62 C3 00 00 00 |r..b....|
|
|
これなら、盗み見られたとしても、データ漏洩に歯止めを掛けられます。
設定にしても、難しいものではありません。この機能を使うか否かは、システムを作る側の人間が決めることです。負荷テストで問題にならなければ、採用を提案したいですね。
星野真里 (ほしのまり)
株式会社システム・テクノロジー・アイ 取締役。Oracleのチューニング・コンサルティングやセミナー講師として活躍する ITエンジニア。Oracle歴は17年。Oracle認定講師およびIBM
WebSphere認定講師。 社内的には、「火消し」と呼ばれるスポット・チューニング作業は最も得意。 『DBマガジン』『ITProfessional』『WebSphereMagazine』などにも寄稿中。
|