トップページへ PASSJ ブログへ
トップページへ
分科会
特集!
コミュニケーション
資格
セミナー・コンファレンス
インフォメーション
セキュリティ分科会 ボードリーダー 河端 善博  
第4回 暗号化決定
はじめに
オブジェクトを暗号化する
ネットワーク通信を暗号化する
データを暗号化する
おわりに
     

【はじめに】
前回は、権限について説明しました。
今回は、SQL Serverのオブジェクトや通信、データを暗号化します。セキュリティの基本は、「見せない」です。
大切な通信やデータを隠すことにより、不正利用やデータ漏洩を防ぐことができます。

【オブジェクトを暗号化する】
SQL Server は、以下のオブジェクトを暗号化することができます。

  • ストアドプロシージャ
  • ユーザー定義関数
  • トリガ
  • ビュー

暗号化することにより、処理の内容を他の利用者や管理者からプログラムの内容をある程度、隠すことができます。
暗号化するには、オブジェクトの作成・編集時に WITH ENCRYPTION を指定します。
オブジェクトの種類ごとに示すと次のようになります。

オブジェクトの暗号化方法一覧
  ストアドプロシージャ   CREATE PROCEDURE 名前
  WITH ENCRYPTION
  ユーザー定義関数   CREATE FUNCTION 名前 (引数...)
  WITH ENCRYPTION
  トリガ   CREATE TRIGGER 名前 ON { TABLE | VIEW }
  WITH ENCRYPTION
  ビュー   CREATE VIEW 名前 WITH ENCRYPTION

暗号化に関する注意点は次のようになります。

オブジェクト暗号化の注意点一覧
  テスト完了後に暗号化する 暗号化すると、SQL Server の標準機能では解読して元にもどすことはできません。
テスト完了後に暗号化するようにします。
  暗号化前に別途、保存する 解読は標準機能ではできませんので、暗号化する前にテキストファイルなどに別途オブジェクトのソースファイルを保存しておきます。
  レプリケーションされない オブジェクトを暗号化すると、そのオブジェクトはレプリケーションされなくなります。
  解読するツールがある 暗号化されたオブジェクトは、SQL Serverの機能では解読することはできません。しかし、解読するツールがインターネットで公開されています。


暗号化したオブジェクトを Enterprise Managerで確認すると次のようになります。

図 4-001.jpg

次のクエリーにて、暗号化されていることが確認できます。

select o.name, c.text from syscomments c, sysobjects o
where o.name=N'名前' and c.id = o.id


図 4-002.jpg

図では、通常のストアドプロシージャ byroyaltyと、暗号化済みのストアドプロシージャ byroyaltyEncrypted について調べています。
byroyalty は、プログラムの内容が text フィールドで確認できますが、一方 byroyaltyEncrypted は、内容がわからないようになっています。
このように暗号化すると、たとえデータベースのシステム管理者であっても、SQL Serverの標準機能では解読することはできません。

しかし、解読ツールがインターネットで提供されています。たとえば、dSQLSRVD があります。

dSQLSRVD
http://www.geocities.com/d0mn4r/dSQLSRVD.html

図4-003.jpg

このツールを利用すると、簡単にオブジェクトを解読して、元のプログラムを取り出すことができます。SQL Server 2000では、管理者の権限がなければ、このようなツールを利用しても解読できないようになっています。
したがって、オブジェクトの暗号化については、次のように考える必要があります。

オブジェクトの暗号化についての指針
  一般ユーザー対策と考える WITH ENCRYPTION により一般ユーザーからオブジェクト内の処理の内容やデータを隠すことができます。
  管理者対策からは隠せない 解読ツールがインターネットで公開されていますので、sysadmins ロールを持つ管理者から隠すことはできません。
不正アクセス者が不当に管理者権限を取得した場合もオブジェクトの内容は隠せません。

アルゴリズムや処理の内容を sysadmins 権限のあるシステム管理者、データベース管理者から隠すには、EXE や DLL 形式のプログラムにすることをお勧めします。

【ネットワーク通信を暗号化する】
SQL Server のネットワーク通信を暗号化するには、次の方法があります。

ネットワークの暗号化方法
  SQL Serverプロトコ暗号化 SQL Server の通信プロトコルを暗号化します。
  IPSec Windows の IPSec 機能を利用して暗号化します。
  HTTPS SQLXMLや XML Web Service を利用してSQL Server と通信する場合に利用します。
  VPN SSL など暗号化通信ツールを利用します。

ネットワーク通信を暗号化するには、さまざまな方法があります。利用目的やネットワーク環境、ハードウェア環境に応じて、方法を選択します。
まず、SQL Serverのネットワーク通信が暗号化されていない場合、どのように見えるのかを確認します。
ネットワーク通信内容を確認するには、Windows 2000 では、付属のネットワークモニタを利用することができます。ここでは、シェアウェアでよりわかりやすい次のツールを使ってみてみます。

Vigil (SAPPOROWORKS)
http://homepage2.nifty.com/spw/software/vigil/index.html
シェアウェア 1,000円

このツールを利用して、次のクエリーのネットワーク通信を確認してみます。

select title_id, title from titles where title_id='BU1111'

図4-004

図の右側の通信の内容をみると、クエリーの内容が赤い文字、クエリーの結果が青い文字で表示されているのがわかります。
このようにデータベースへのアクセスは、ネットワーク上をそのまま流れています。
通信の内容を暗号化するに「サーバーネットワークユーティリティ」を利用します。

図4-005

図の「プロトコル暗号化を設定する」をチェックします。また、サーバーの証明書をBooks OnlineやSQL Serverのマニュアルを参照して設定します。
設定後、SQL Server をいったん停止させ、再度実行します。この後、接続すると通信の内容は暗号化されます。

IPsec は、Windows 2000、Windows XP、Windows Server 2003 には標準で提供されている機能です。SQL Server だけでなく、さまざまなプログラムのネットワーク通信を暗号化することができます。

【データを暗号化する】
データを暗号化するための一般的な機能は、SQL Serverにはありません。
唯一 SQL Serverがパスワードを暗号化して保存する関数を利用することができます。

関数名 pwdencrypt

次のようにクエリーを実行することにより、暗号化したパスワードを取得することができます。

  declare @crypt varbinary(256)
  select @crypt = pwdencrypt('xxxxxxx')


なお、この関数は、Books Online には掲載されていません。
より一般的な暗号化を SQL Server上で行うツールとしては、次の xp_crypt があります。

XP_CRYPT 3.5
http://www.activecrypt.com/product.htm

図4-006

拡張ストアードプロシージャとして実装されていて、機能としては、ハッシュ、暗号、電子証明書の機能があり、無償版でも一部の機能を利用することができます。
たとえば、ハッシュを求めるには次のようになります。

DECLARE @crypted varchar(40)
EXEC xp_sha1 '1234567890', @crypted OUTPUT

【おわりに】
SQL Serverのオブジェクト、ネットワーク通信、データを適切に暗号化し、データ漏洩や不正アクセスを防ぐようにしましょう。また、データベースのバックアップファイルも暗号化しないといけませんので、注意しましょう。

★この連載に関する質問・意見交換は、下記の掲示板・MLをご利用ください★
セキュリティ分科会メーリングリスト pml-security@sqlpassj.org

「SQL Serverセキュリティのキ・ホ・ン」 目次
第1回 認証モード
第2回 アカウントの作成
第3回 権限の設定
第5回 開発上の注意点

 
PASSJメールニュース 著作権ついて プライバシーポリシー リンクポリシー お問い合わせ
(C) 2005 Professional Association for SQL Server Japan. All rights reserved.