DB2eCLP を使用した暗号化

このセクションには、アプリケーションでデータ暗号化の使用法を示す目的で設計されたサンプルの対話式セッションの例が含まれています。各操作を説明したコメントが追加されています。

-- DB2eCLP を使用した暗号化
--
-- これは提供されたサンプル・コマンド行インターフェース・プログラム
-- DB2eCLP を使用した暗号化セッションの例です。
--
-- 失敗した場合にはステートメントの戻りコードのみを、
-- 正常に完了した場合には選択の結果のみを
-- 示しています。
-- DB2 Everyplace に入力できるコマンドには、
-- 先頭に「CLP:>」というストリングが付いています。
--
-- -- (CLI:SQLConnect, SQL:CREATE TABLE, SQL:GRANT, SQL:REVOKE)
--
-- DB2eCLP を開始すると、自動的に現行ディレクトリーにある
-- デフォルト・データベースに接続されます。
-- これは以下のコマンドを実行するのと同じことです。
--
CLP:> CONNECT TO anything;
 
-- 「anything」という名前だけで特定のパスが指定されていないため、
-- 現行ディレクトリーに接続されます。
--
-- ここで、スウェーデン語の数を表す言葉へのマッピングが含まれた
-- 暗号化されていない表を作成することにします。
 
CLP:> CREATE TABLE swedish(nummer INT, ord VARCHAR(32));
CLP:> INSERT INTO swedish VALUES(1, 'ett');
CLP:> INSERT INTO swedish VALUES(3, 'tre');
CLP:> INSERT INTO swedish VALUES(4, 'fyra');
CLP:> INSERT INTO swedish VALUES(5, 'fem');
CLP:> INSERT INTO swedish VALUES(7, 'sju');
CLP:> INSERT INTO swedish VALUES(99, 'nittionio');
 
-- データを見ると、以下のようになっています。
CLP:> SELECT * FROM swedish;
 
NUMMER      ORD                             
----------- --------------------------------
          1 ett                             
          3 tre                             
          4 fyra                            
          5 fem                             
          7 sju                             
         99 nittionio                       
6 row(s) returned.
 
-- ここで、英語の対応する表の作成を試みます。
-- ただし、ここでは暗号化を使用します。
--
CLP:> CREATE TABLE english(number INT, word VARCHAR(32)) WITH ENCRYPTION;
Statement failed [sqlstate = 42501].
 
-- ここではまだ許可を受けていないため、エラー・コードで示されているとおり
-- 操作は失敗します。
-- そのため再度接続する必要があります。
--
CLP:> CONNECT TO something USER jsk USING hemligt;
 
-- これで同じデータベース (デフォルト/現行ディレクトリー) に接続されますが、
-- 特定のユーザー ID「jsk」とパスワード「hemligt」が使用されます。
-- CONNECT TO コマンドは SQL ステートメントではないため、
-- DB2eCLP アプリケーションによって解釈されます。このコマンドは、
-- 以下を使用して DB2 Everyplace データベースへの接続を切断し、
-- 再び接続します。
--    SQLConnect(hdbc, "something", SQL_NTS, "jsk", SQL_NTS, "hemligt", SQL_NTS);
--
-- ここで、最初に許可ユーザーを作成する必要があります。最初のユーザー
-- を作成する際は、ログインされたユーザーと同じ名前と同じパスワード
-- を持っていなければなりません。
--
CLP:> GRANT ENCRYPT ON DATABASE TO "jsk" USING "hemligt" NEW "hemligt";
 
-- GRANT の場合、名前とパスワードは二重引用符で囲まなければなりません。
-- これは名前とパスワードには大文字小文字の区別があり、
-- ステートメントが直接 DB2 Everyplace に渡されるからです。
--
-- これで許可された暗号化ユーザーが作成され、暗号化された表
-- を作成できるようになります。
--
 
CLP:> CREATE TABLE english(number INT, word VARCHAR(32)) WITH ENCRYPTION;
CLP:> INSERT INTO english VALUES(1, 'one');
CLP:> INSERT INTO english VALUES(3, 'three');
CLP:> INSERT INTO english VALUES(4, 'four');
CLP:> INSERT INTO english VALUES(5, 'five');
CLP:> INSERT INTO english VALUES(7, 'seven');
CLP:> INSERT INTO english VALUES(99, 'ninety nine');
 
-- データを見ると、以下のようになっています。
CLP:> SELECT * FROM english;
 
NUMBER      WORD                            
----------- --------------------------------
          1 one                             
          3 three                           
          4 four                            
          5 five                            
          7 seven                           
         99 ninety nine                      
6 row(s) returned.
 
-- スウェーデン語で大きな数をランダムに選びます。
--
CLP:> SELECT * FROM swedish WHERE nummer > 42;
 
NUMMER      ORD                             
----------- --------------------------------
 
         99 nittionio                       
1 row(s) returned.
 
-- 英語で大きな数をランダムに選びます。
--
CLP:> SELECT * FROM english WHERE number > 42;
 
NUMBER      WORD                            
----------- --------------------------------
         99 ninety nine                      
1 row(s) returned.
 
--「fyra」を英語に変換します。
--
CLP:> SELECT word FROM swedish, english WHERE number = nummer AND ord = 'fyra';
 
WORD                            
--------------------------------
four                            
1 row(s) returned.
 
-- 変換表を取得します。
--
CLP:> SELECT number, ord, word FROM swedish, english WHERE number = nummer;
 
NUMBER      ORD                              WORD                            
----------- -------------------------------- --------------------------------
          1 ett                              one                             
          3 tre                              three                           
          4 fyra                             four                            
          5 fem                              five                            
          7 sju                              seven                           
         99 nittionio                        ninety nine                      
6 row(s) returned.
 
-- 別のユーザーに、そのユーザー自身のパスワードを使用して暗号化されたデータ
-- にアクセスすることを許可することを試みます。
--
CLP:> GRANT ENCRYPT ON DATABASE TO "xin" USING "notKnown" NEW "notKnown";
Statement failed [sqlstate = 42506].
 
-- 新しいユーザーを追加するためには、ログインするユーザーが自分自身を妥当性検査
-- しなければならないため、この操作は失敗します。この検査は、USING 文節の後
-- に自分のパスワードを指定することによって行われます。
--
CLP:> GRANT ENCRYPT ON DATABASE TO "xin" USING "hemligt" NEW "notKnown";
 
-- 新規ユーザーに再接続します。
--
CLP:> CONNECT TO samething USER xin USING notknown;
Statement failed [sqlstate = 42505].
 
-- パスワードが同じでないため同じキーが生成されず、アクセスが拒否されるため、
-- この操作は失敗します。
--
CLP:> CONNECT TO samething USER ksin USING notKnown;
 
-- ユーザー ksin が存在せず、そのためユーザーの認証を試みないので、
-- この操作は失敗することはありません。
-- しかし、SQLGetInfo を使用すれば、このようなケースと、ユーザーが
-- 正常に認証されたケースとを区別することができます。
--
CLP:> SELECT * FROM swedish;
 
NUMMER      ORD                             
----------- --------------------------------
          1 ett                             
          3 tre                             
          4 fyra                            
          5 fem                             
          7 sju                             
         99 nittionio                       
6 row(s) returned.
 
-- 暗号化されていないデータの選択は正しく行われますが、許可されたユーザー
-- が接続されない限り、暗号化されたデータの読み取り/更新はできません。
--
CLP:> SELECT * FROM english;
Statement failed [sqlstate = 42501].
 
-- 最後に正しいユーザー名とパスワードを用いて、新規ユーザーとして接続します。
--
CLP:> CONNECT TO samething USER xin USING notKnown;
 
-- 認証が済み、データにアクセスできるようになっているか検査します。
--
CLP:> SELECT * FROM english;
 
NUMBER      WORD                            
----------- --------------------------------
          1 one                             
          3 three                           
          4 four                            
          5 five                            
          7 seven                           
         99 ninety nine                      
6 row(s) returned.
 
-- 別のユーザーを追加します。
--
CLP:> GRANT ENCRYPT ON DATABASE TO "thf" USING "notKnown" NEW "heimlich";
 
-- 現在存在するユーザーをリストします。
--
CLP:> SELECT username, grantorname FROM "DB2eSYSUSERS";
 
USERNAME            GRANTORNAME        
------------------- -------------------
jsk                 jsk                
xin                 jsk                
thf                 xin                
3 row(s) returned.
 
-- 再度「jsk」として接続します。
--
CLP:> CONNECT TO itagain USER jsk USING hemligt;
Statement completed successfully.
 
-- パスワードを「secret」に変更します。
--
CLP:> GRANT ENCRYPT ON DATABASE TO "jsk" USING "secret" NEW "secret";
Statement failed [sqlstate = 42506].
 
-- 最初に古いパスワードを指定してから新しいパスワードを指定する必要があるため、
-- この操作は失敗します。
--
CLP:> GRANT ENCRYPT ON DATABASE TO "jsk" USING "hemligt" NEW "secret";
 
-- 新規パスワードを試してみます。
--
CLP:> CONNECT TO itagain USER jsk USING secret;
 
-- 暗号化されたデータにアクセスできることを確認します。
--
CLP:> SELECT * FROM english;
 
NUMBER      WORD                            
----------- --------------------------------
          1 one                             
          3 three                           
          4 four                            
          5 five                            
          7 seven                           
         99 ninety nine                      
6 row(s) returned.
 
-- 「xin」の暗号化特権を取り消します。
--
CLP:> REVOKE ENCRYPT ON DATABASE FROM "xin";
 
-- ユーザーをリストします。
--
CLP:> SELECT username, grantorname FROM "DB2eSYSUSERS";
 
USERNAME            GRANTORNAME        
------------------- -------------------
jsk                 jsk                
thf                 xin                
2 row(s) returned.
 
-- 存在しないユーザーに再度接続します。エラーは出ません。
--
CLP:> CONNECT TO thedatabase USER xin USING idontknow;
 
-- 許可を受けずに暗号化操作を試みます。
--
CLP:> SELECT * FROM english;
Statement failed [sqlstate = 42501].
 
CLP:> DROP TABLE english;
Statement failed [sqlstate = 42501].
 
CLP:> REVOKE ENCRYPT FROM "jsk";
Statement failed [sqlstate = 42601].
 
CLP:> GRANT ENCRYPT ON DATABASE TO "xin" USING "idontknow" NEW "idontknow";
Statement failed [sqlstate = 42502].
 
-- 「thf」として接続します。
--
CLP:> CONNECT TO thedatabase USER thf USING heimlich;
 
-- 暗号化されたデータを読み取れるかどうかチェックします。
--
CLP:> SELECT * FROM english;
 
NUMBER      WORD                            
----------- --------------------------------
          1 one                             
          3 three                           
          4 four                            
          5 five                            
          7 seven                           
         99 ninety nine                      
6 row(s) returned.
 
-- 接続されているユーザーの特権を取り消します。
--
CLP:> REVOKE ENCRYPT ON DATABASE FROM "thf";
 
-- そのユーザーがデータにアクセスできなくなったことを確認します。
--
CLP:> SELECT * FROM english;
Statement failed [sqlstate = 42501].
 
-- 以下のようにして、唯一残っているユーザー「jsk」としてデータベースに接続した場合に、
--
CLP:> CONNECT TO thedatabase USER jsk USING secret;
 
-- 接続されているユーザーを除去すると、そのユーザーはデータにアクセスできなくなります。
-- 実際に、暗号化されたデータに再びアクセスする方法はありません。
--
 
CLP:> REVOKE ENCRYPT ON DATABASE FROM "jsk";
 
-- ユーザーが残っていないことを確認します。
-- 
CLP:> SELECT username, grantorname FROM "DB2eSYSUSERS";
 
USERNAME            GRANTORNAME        
------------------- -------------------
0 row(s) returned.
 
-- これで暗号化されたデータにアクセスすることはできなくなりました。
-- 
CLP:> SELECT * FROM english;
Statement failed [sqlstate = 42501].
 
-- これでセッションの例は終了です。
 

関連したタスク