| 【はじめに】
前回は、権限について説明しました。
今回は、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で確認すると次のようになります。
次のクエリーにて、暗号化されていることが確認できます。 select
o.name, c.text from syscomments c, sysobjects o
where o.name=N'名前' and c.id = o.id
図では、通常のストアドプロシージャ byroyaltyと、暗号化済みのストアドプロシージャ byroyaltyEncrypted
について調べています。
byroyalty は、プログラムの内容が text フィールドで確認できますが、一方 byroyaltyEncrypted
は、内容がわからないようになっています。
このように暗号化すると、たとえデータベースのシステム管理者であっても、SQL Serverの標準機能では解読することはできません。
しかし、解読ツールがインターネットで提供されています。たとえば、dSQLSRVD があります。
dSQLSRVD http://www.geocities.com/d0mn4r/dSQLSRVD.html
このツールを利用すると、簡単にオブジェクトを解読して、元のプログラムを取り出すことができます。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'
図の右側の通信の内容をみると、クエリーの内容が赤い文字、クエリーの結果が青い文字で表示されているのがわかります。
このようにデータベースへのアクセスは、ネットワーク上をそのまま流れています。
通信の内容を暗号化するに「サーバーネットワークユーティリティ」を利用します。
図の「プロトコル暗号化を設定する」をチェックします。また、サーバーの証明書を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
拡張ストアードプロシージャとして実装されていて、機能としては、ハッシュ、暗号、電子証明書の機能があり、無償版でも一部の機能を利用することができます。
たとえば、ハッシュを求めるには次のようになります。
DECLARE @crypted varchar(40)
EXEC xp_sha1 '1234567890', @crypted OUTPUT 【おわりに】
SQL Serverのオブジェクト、ネットワーク通信、データを適切に暗号化し、データ漏洩や不正アクセスを防ぐようにしましょう。また、データベースのバックアップファイルも暗号化しないといけませんので、注意しましょう。
|