本稿はデータベースソフトウェア「SQL Anywhere」およびデータベース全般に関する英語ドキュメントを翻訳する形で提供しています。図など、部分的に英語のままになっていますが、製品のSQL Anywhere自体は完全に日本語化されていますのでご安心ください。
概要
Webサービスをテーマとするこれまでの記事では、話を複雑にするためという理由で、セキュリティオプションを無視するのが通例でした。しかし現実の商用アプリケーションの多くは、プライバシー、セキュリティ、データの完全性といった問題と関わりを持つものです。Webサービスを利用してデータアクセスを効率化するにしても、この問題を見落とすことがあってはなりません。本稿では、企業向けアプリケーションと小規模事業所向けアプリケーションのどちらでも等しく利用できる各種のセキュリティオプションについて解説します。Webサービスのセキュリティを支える機能を中心に話を進めますが、特定のデータベースに関連する話題としてSQL Anywhere 11でデータをセキュリティ保護する方法についても簡単に触れます。読者は、Webサービスとセキュリティの概念を熟知していることが望まれますが、その専門家である必要はありません。
要件
- SQL Anywhere 11
- Mozilla Firefox、Internet Explorer、または同等のブラウザ
はじめに
ここ数年のIT業界はSOAPサービスに重点を置くようになっていますが、それには十分な理由があります。SOAPは以前から利用されているサービス指向アーキテクチャの標準であり、特別な変更を加えなくても各種のプラットフォームを使用するユーザーにデータを供給できる柔軟性をもたらします。IBMとMicrosoftが述べているとおり、「... 疎結合、言語的中立性、プラットフォーム非依存という3つの特質を備えた方法でアプリケーション同士を組織内、企業間、さらにはインターネット上でリンクすることのメリットは、ますます明らかになりつつある」のです。データベースの世界では、これは企業データをSOAP/DISHサービスによって公開することを意味します。SQL Anywhere 11には、この種の要求を待ち受けて応答を返すことができるWebサーバが組み込まれています。要するに、これを使えば、それぞれ別のサービスで要求を待ち受けてデータベースに接続する必要性が減るということです。
Webサービスをテーマとするこれまでの記事では、SOAPの柔軟性に関する話題はすぐ語られるのに、セキュリティオプションについては、話を簡単にするためという理由で無視されるのが常でした。IBMとMicrosoftがこの重要性を把握していることは、「... 顧客、業界アナリスト、そして報道機関は、Webサービスの勢いが強まってくると、取り組むべき重要な領域が存在することに気付く。それがまさにセキュリティである」と述べていることからも分かります。現実の商用アプリケーションならば、取り扱うデータの完全性を保証するために、同じように標準化されたセキュリティプロトコルを利用することが必要になるはずです。そこで次の疑問が生じます。SOAPサービスをセキュリティ保護することはできるのか? そのセキュリティを既存の環境に実装するのはどのぐらい難しいのか?ということです。
幸い、柔軟性のためにセキュリティを犠牲にする必要はありません。TLS(Transport Layer Security)や暗号化されたHTTPSプロトコルを使えば、セキュリティ上の問題に対処しつつSOAPサービスを提供できます。さらに、サービスの認可という方式を用いて、データを基本的に非公開にしておき、認可された人々だけにアクセスを許すこともできます。こうしたセキュリティ方式は標準化されているので、企業データの提供側と消費側の双方が安心して利用できます。本稿の目的は、セキュリティの細部に踏み込んで、そのさまざまな形式を解き明かすことよりも、データベース駆動型の、SOAPベースのWebサービスに関して、標準的なセキュリティ対策を実装する方法を具体的に示すことにあります。
本稿では、Webサービス自体をセキュリティ保護する具体的な方法を中心に話を進め、データベースレベルのいくつかの方式についても取り上げます。SOAP Webサービスをデータベース内から作成し、必要な手順に従ってセキュリティを有効にするまでの作業を説明します。以上の作業が完了すると、Webサービスは安全にアクセスされるようになり、セキュリティ保護された完全なトランザクションが得られます。ここでは、こうした機能を簡単に実演できるように、SQL Anywhere 11を使用します。
SQL Anywhere 11でセキュリティ保護されたSOAP/DISH Webサービスを作成する
Webサービスをセキュリティ保護する最初の一歩は、データベースエンジンを適切なやり方で起動することです。これにはいくつかのステップが必要です。通常は、まずコンソールからコマンドdbeng10 demo.db ‐xs http(port=8888)
を使用してデモデータベースを起動します。これはデータベースエンジンにhttp要求をポート8888で待ち受けさせるときの標準的なコマンドです。補助的なWebサービスは必要ありません。
ただし、セキュリティ保護されるHTTPSのTLS(Transport Layer Security)を有効にするために、何よりも最初にセキュリティ証明書が必要です。デジタル証明書によってクライアントとサーバはRSAまたはECC暗号化方式を使用して相互に認証を行うことができます。これは、私は私が本人であることを証明し、あなたはあなたが本人であることを証明する、というようなものです。証明機関によって作成された証明書だけが双方で認証されます。従って、本物の証明書をねつ造することはできません。つまり、相手の証明書を調べてそれが適正なものであると分かれば、相手を信頼してよいことになります。SQL Anywhere 10におけるデジタル証明書とその用法は、X.509標準に従います。しかし、まだ問題があります。証明書を手に入れるにはどうすればよいか、という点です。企業ユーザーであれば、民営の証明機関に問い合わせるのが順当なところですが、小規模な組織ではcreatecert
ユーティリティを利用するのがよいでしょう。
まだ自分の証明書を持っていない場合は、コンソールからコマンドcreatecert
を実行してください。このユーティリティは、テストや小規模事業所の要件を満たす自己署名ルート証明書を作成します。必ず、RSA暗号化方式を意味するRを選択してください。この証明書はTLS(Transport Layer Security)で使用することが想定されているので、RSAが必須です。これ以外のフィールドには必要な情報を適宜入力します。入力が不要なフィールドは、Enterキーを押してスキップします。ドキュメントと齟齬が生じないよう、以下の図で各フィールドに使用している値は、アイエニウェアのサンプルで使われているものに合わせてあります。
証明書はそれぞれのクライアントが各自を認証するために使用するもので、IDはWebサービスがそのサービス自体を認証するために使用するものです。秘密鍵は証明書の認証に必要な情報が格納された場所です。つまり、IDと秘密鍵のファイルを安全に保管しておきさえすれば、後は信頼するクライアントに証明書を自由に配布できます。
IDファイルの作成後、セキュリティ保護されたリスナを使用してポートに結合し、セキュリティ保護されたHTTPS要求を待ち受けることができます。コンソールからコマンドdbeng11 demo.db ‐xs https(port=8888;certificate=C:\id.pem;certificate_password=pwd)
を使用してデモデータベースを起動します。SQL Anywhereのドキュメントを読むと、FIPS承認の暗号化なるものを使うと書かれています。これは別途ライセンスを取得して使用するライブラリで、標準で設定されるシステム一式には大抵含まれていません。FIPSについては、本稿で後ほど説明します。「demo.db」の部分は、必ず実際のデータベースファイルのファイル名に置き換えてください。なお、このソリューションを現実の運用環境に展開するときは、「dbeng11」を「dbsrv11」に置き換えて他のマシンからの要求を受けつけられるようにする必要があります。
前と同じく‐xs
スイッチを使用しますが、今回はhttps
オプションが付くことに注意してください。HTTPSでは、RSA証明書とそれに対応する鍵ファイルのパスワードを使用する必要があります。
データベースエンジンが稼働しているので、SOAPサービスを作成できます。この作業は、SQL Anywhereのデータベース管理ツールであるSybase Centralから短時間で手際よく行うことができます。
Sybase Centralを起動した後、[Connections]メニューの[Connect with SQL Anywhere 11...]をクリックします。
入力が促されたら、ユーザー名として「dba」、パスワードとして「sql」を入力します。これらはSQL Anywhereに付属するデモデータベースにログインするための資格情報です。これらの値は、必ず実際のログイン資格情報と置き換えてください。[Database]タブをクリックして次の作業に進みます。
サーバ名のフィールドに「demo」と入力します。これは以前のステップで開始したデータベースエンジンの名前です。この値は、必ず実際のデータベースエンジンの名前と置き換えてください。入力後、[OK]をクリックします。実際、データベースの完全性を保つため、自分がたとえ管理者であってもセキュリティ保護された接続を確立するようにしてください。この種の保護については、後ほどデータベースレベルのセキュリティのところで説明します。
[Web Services]をダブルクリックし、左側にあるタスクの一覧から[Create a web service...]を選択します。
ウィザードが起動され、名前の入力が促されます。「MySecureSOAP」と入力し、[Next]をクリックします。Webサービスの種類を指定するよう促されたら、「SOAP」を選択し、[Next]をクリックします。
ここで実際に選択できるフォーマットにはいくつか種類があります。「RAW」を選択すると、Webブラウザでサービスをブラウズするときに未加工のテキストが出力されます。「XML」と「HTML」では、XML/HTTPリーダー用のマークアップ言語でデータが処理されます。このフォーマットについては、本稿で後ほど触れます。「DISH」サービスは、WSDLシートを使用して他のSOAPサービスを公開します。簡単に言えば、これには他のSOAPサービスから利用できるサービスを仲介し、それらがどのようなデータを取り込み、どのようなデータを出力するかを記述する機能があります。今回は汎用的なサービス指向のプロバイダを作成しようとしているので、「SOAP」を選択します。
入力が促されたら、Data Payload Format(データペイロードフォーマット)として「Default」を選択し、[Next]をクリックします。Data Type Behaviour(データの型付け動作)については、「Off」を選択し、[Next]をクリックします。これですべてのデータがプレーンテキストとして扱われるようになります。
どの要求メソッドをサポートするかの問いには、デフォルトの「HEAD」と「POST」を指定します。
柔軟で汎用的なサービスを作成することが目的なので、ここではデフォルトのSOAPフォーマットを使います。もちろん、Javaの標準的なアプリケーションや.NETアプリケーション内から特定のデータフォーマットを使用することもできます。データの型付けは、複雑なので無視されます。この例のデータは、いずれにせよテキストとして扱われるので、データの型付けは必要ありません。
入力が促されたら、[Require authorization for this service]チェックボックスをオンにしたまま、DBAユーザーを選択し、[Next]をクリックします。このウィザードは、極めて単純なやり方で企業データのプライバシーを保護します。認可したデータベースユーザーだけにデータへのアクセスを認めるという方法です。これをセットアップするには、このサービスへのアクセスを許可したいユーザーを選択します。アクセスを求めるユーザーが複数存在する場合は、グループを作成し、Userの代わりにそのグループを選択します。もう1つのやり方は、特定のユーザーを指定しないようにすることです。そのようにすると、必要な権限を持つデータベースユーザーが全員認証されます。
[Require security for this service]チェックボックスをオンにし、[Next]をクリックします。これで、データベースはセキュリティ保護されたHTTPS接続だけを使うようになります。データベースの起動時にHTTPSリスナしか指定しなかったので、これを必ずオンにしなければなりません。これ以外に使用できる接続がないからです。
入力が促されたら、SQLステートメントとしてSELECT * FROM Customers
を入力し、[Next]をクリックします。必要ならコメントを入力し、最後に[Finish]をクリックします。
これで、セキュリティ保護と汎用性を併せ持つSOAP Webサービスを作成できました。このサービスに.NETまたはJavaからアクセスするつもりなら、SOAPサービスを仲介するDISHサービスを作成する必要があります。特定のアプリケーションからSOAPサービスにアクセスする方法については、本稿の範囲を超えるので説明しません。ここでは標準のWebブラウザからSOAPサービスにアクセスします。次に、その手順を説明します。
セキュリティ保護されたWebサービスにアクセスする
何か決まったソフトウェアを使わなくても、先ほど作成したWebサービスには任意のWebブラウザからアクセスできます。これを行うには、上の設定に少しだけ変更を加える必要があります。このサービスをSOAPサービスとして呼び出すのではなく、HTMLサービスにする必要があります。Sybase CentralのWebサービスの一覧で、新しく作成された「MySecureSOAP」を右クリックし、[Properties]を選択します。
[Service type]を「HTML」に変更し、[OK]をクリックします。テストの目的でWebブラウザからサービスにアクセスできるようにするだけなら、これで十分です。
お好きなWebブラウザでhttps://localhost:8888/MySecureSOAPにアクセスします。これでWebサービスとの間にセキュリティ保護された接続が確立されます。Mozilla Firefoxでは、次の警告が出ることがあります。これはセキュリティ保護されたHTTPSリスナの作成に用いた証明書が、createcert
によって生成した自己署名ルート証明書だからです。企業ユーザーであれば、この警告を避けたいので、民営の証明機関から完全署名の証明書を取得することになるでしょう。証明書を受け入れることを選び、[OK]をクリックします。
次に、ログイン資格情報を入力するよう促されます。これは、それが認可の必要なサービスであるとしてセットアップされているからです。ユーザー名は「dba」、パスワードは「sql」とします。
認証が成功すると、WebサービスによってCustomersテーブルのデータが表示されます。
Mozilla Firefoxでは、アドレスバーに表示される錠前アイコンをクリックすると、セキュリティ情報を見ることができます。他のブラウザにも同様のオプションがあるはずです。図を見て分かるように、このサービスは自己署名の証明書でセキュリティ保護されています。しかし、さらに重要なのは、ハイグレードなRC4 128ビットの暗号化方式が使われていることです。
Webサービスのセキュリティ機能についてのテストが完了したら、前に説明したのと同じ方法で、必ずそれをSOAPサービスに戻してください。
SQL Anywhere 11でデータベースをセキュリティ保護する
データ供給をセキュリティで保護し、なおかつ認可制にすべきであることはアナリストも認めるとおりですが、その基盤となるデータが安全に格納されていなければ、アクセスをセキュリティ保護してもほとんど効果はありません。アクセスだけでなく、ストレージにも注意を向ける必要があります。その目的のために、SQL Anywhereには、データベースの作成時にだけ有効にできるデータベースレベルの暗号化機能が用意されています。管理ツールであるSybase Centralには、そのための直観的なウィザードがあります。
[Tools]メニューで[SQL Anywhere 11]をポイントし、[Create Database...]を選択します。
初期画面で[Next]をクリックし、[Create a database on this computer]を選択します。[Next]をクリックして次へ進みます。
入力が促されたら、データベースファイルのファイル名とパスを入力します。[Next]をクリックし、ログファイルのファイル名を指定します。[Next]をクリックして次へ進みます。
[Maintain the following mirror log file]チェックボックスはオフのまま、[Next]をクリックします。[Install jConnect meta‐information support]チェックボックスは、オンのままでもオフにしてもかまいません。どちらにしてもこのデモでは意味がありません(Javaの接続性に関係するオプションです)。
次の画面はセキュリティに大きく影響します。必ず[Enable encryption]チェックボックスをオンにしてください。単純な暗号化(simple encryption)と強力な暗号化(strong encryption)のどちらかを選ぶことができます。単純な暗号化は、いわゆる難読化のことです。データをプレーンテキストで保存するとデータベースのコンテキストが外部からそのまま見えてしまうので、そのような形で保存しないことで簡単に読み取られるのを防ぐ方式です。しかし、単純な暗号化は鍵を持たないので、簡単に破られてしまいます。強力な暗号化は、接続時に毎回入力しなければならない鍵を利用する方式です。これはAES(Advanced Encryption Standard)という暗号化方式を利用しており、鍵なしで破るのは困難です。強力な暗号化の方を選ぶと、FIPS承認の暗号化を使うかどうかの選択肢が有効になります。ただし、この暗号化を使うには、前に述べたように別途ライセンスとライブラリをインストールする必要があります。ここでは'Strong encryption'と'AES'を選択し、暗号化鍵の値を'secure'としてください。データベース全体を暗号化するか、特定のテーブルだけを暗号化するかを選択できます。
FIPSという略語が2回現れたので、これをもう少し説明しておきます。FIPS(Federal Information Processing Standard: 連邦情報処理標準)は、セキュリティとその実装に関する規格です。証明書はNIST(National Institute of Standards and Testing: 米国国立標準技術研究所)とCSE(Canadian Communication Security Establishment: カナダ通信安全保障局)から提供されます。主に軍事以外の政府機関や政府請負業者によって利用されています。政府と取引のある企業は、このオプションを使うことになるでしょう。
この画面で必要な設定を終えたら、[Next]をクリックして次へ進みます。データベースページサイズは、デフォルトのままでかまいません。[Finish]をクリックします。
データベースの作成が成功すると、次のウィンドウが表示されます。[Close]をクリックして次へ進みます。
Sybase Centralを閉じると、データベースプロセスが自動的に停止します。コンソールからデータベースエンジンを再起動します。使用するコマンドはdbeng11 securedb.db ‐ek "secure" ‐ec tls(tls_type=RSA;certificate=id.pem;certificate_password=pwd)
です。‐ek
スイッチは、データベースエンジンにデータベースを暗号化するよう指示し、暗号化の鍵を指定します。‐ec
スイッチは、データベースエンジンにRSA暗号化TLS(Transport Layer Security)ですべての通信を暗号化するよう指示します。前に述べたように、RSA暗号化では、サーバのIDファイルと鍵ファイルが必要です。
データベースエンジンの起動が成功すると、次のログが表示されます。RSA暗号化とTCPIPが使われていること、この2点に注目してください。データベースは確かにセキュリティ保護されています。
まとめ
本稿では、SQL Anywhere 11のWebサービスに関するセキュリティオプションとプライバシーオプションを取り上げ、証明書を作成してサービスをセットアップするまでの手順を詳しく説明しました。さらに、データベースのストレージを暗号化でセキュリティ保護する手順を具体的に示し、FIPS暗号化の意味を簡単に説明しました。また、簡単なテストの意味で、セキュリティ保護されたWebサービスにMozilla Firefoxでアクセスしました。SOAP Webサービスは、柔軟性を高めることができる優れた方式ですが、完全性を保証する非常に多くのセキュリティオプションがあります。
参考資料
- IBM & Microsoft (Joint). Security in a Web Services World: A Proposed Architecture and Roadmap. IBM developerWorks. [Online] April 1, 2002. [Cited: May 26, 2008.]
- Digital Certificate. Webopedia. [Online] Internet.com, July 14, 2005. [Cited: May 26, 2008.]