Oracle CloudでOracle Database 20c(プレビュー)のBlockchain Tableを使ってみた話

Blockchain Table

こんにちは、今回はOracle Database 20cプレビュー版にて実装されたBlockchain Tableを使ってみたいと思います。

Blockchain TableはOracle Cloud Infrastructure(OCI)のDBaaSから最新バージョンであるOracle Database 20cプレビュー版を選択することで利用できます。30日のトライアル期間なら無料で利用できます(300ドルの制限有)。

この記事ではBlockchain Tableの理解、OCIのDBaaS作成、Oracle Database 20cプレビュー版からBlockchain Tableの作成、そして実際にWebアプリとの接続まで扱いたいと思います。

最後にBlockchain Tableの特性と用途について考えていきたいと思います。

Blockchain Tableとは

はじめにBlockchain Tableとはについて軽くみていきます。

こちらのブログでBlockchain Tableについて日本語でまとめてあります。こちらを参考にしていきたいと思います。

Blockchain Tableは名前こそBlockchainと入っていますが、いわゆる分散型の「ブロックチェーン 」とは異なります。Blockchain Tableはブロックチェーンの技術、思想をRDB(リレーショナルデータベース)に取り込んだものになります。

公式ドキュメントでは以下のように説明されています。

原文:Blockchain tables are insert-only tables that organize rows into a number of chains. Each row in a chain, except the first row, is chained to the previous row in the chain by using a cryptographic hash.

訳:Blockchain Tableは複数のチェーンに入る行で作られるInsert-onlyテーブルである。初めの1行を除くチェーン内の各行は、暗号学的ハッシュによりチェーン内で以前の行とチェーンとして繋がれる。

https://docs.oracle.com/en/database/oracle/oracle-database/20/admin/managing-tables.html#GUID-E7151628-AF04-48D4-9CB4-F72417AFC391

データの挿入のみでのオペレーションが可能であり、データの修正が許可されず行の削除、テーブルの削除に制限があります。さらに各行のデータがhash化され前の行のhash値も含めたhash値がデータベースに保存されます。オプションとして電子署名を含めることもできます。

具体的な特徴は以下です。

  • 従来のRDBシステムとして利用可能
  • 高い耐タンパ性(改ざん防止)

一般的なブロックチェーンは”非中央集権”であるのに対しBlockchain TableはRDBシステムの機能であるため”中央集権”となります。

以上がOracle Database 20cプレビューで実装されたBlockchain Tableになります。詳しくは公式ドキュメントや、日本語ブログを参照してください。

それでは実際にOCI上で利用できるBlockchain Tableを使っていきます。

Blockchain Tableを作成する下準備

OCI上でDBaaSを作成

Oracle Cloud Infrastructureのコンソール画面のデータベース欄からベア・メタル、VM及びExadataを選択します。(Bare metalって英語だと離すけど日本語でベア・メタルって違和感がありますね)

DBシステムの作成を行います。表示されている通りベア・メタル、VM、Exadataから選択します。今回はVMで作成していきます。

VMのシェイプを選択するのですが、トライアルアカウントではVM.Standard2.1のみ選択可能となっていますね。

コンピュートのVM作成時と同様コンパートメント、ネットワーク、SSHキーを設定します。

次にストレージ管理ソフトウェアの選択です。Oracleのストレージ管理ソリューションのOracle Grid Infrastructure、論理ボリューム・マネージャがあります。

現在Oracle Database 20c プレビュー版を利用するには論理ボリューム・マネージャを選択する必要があります。よって今回は論理ボリューム・マネージャを選択します。

するとデータベース情報設定画面のデータベースのバージョンから20c(プレビュー)を選択できるようになります。

Oracle Database 12c以降マルチテナント・アーキテクチャ機能が追加され、(PDB)プラガブルデータベースで構成されます。ここでオプションとしてPDB名を指定することができます。デフォルト(PDB名指定無し)で作られるPDBは<データベース名>_PDB1となります。

最後にsysユーザーのパスワードを設定、ワークロード・タイプの選択「トランザクション処理」「データ・ウェアハウス」の選択をして作成ボタンを押すと完了です。

起動まで少々時間がかかりますがこれでOracle Databaseシステムを搭載したVMが作成されます。

*Oracle Databaseのソフトウェア・エディション等細かい設定の説明は省きます

DBaaSのVMインスタンスに接続、Databaseにアクセス

先ほど登録したsshキーを使用してssh接続を行います。ユーザールートの.sshディレクトリ内に秘密鍵を配置しておくことで以下のコマンドでsshアクセスを行えます。

*今回の環境はMac OSでターミナルから接続します

ssh [email protected]_address

oracleユーザーになり、sqlplusでデータベースにアクセスします。

sudo su oracle
sqlplus / as sysdba

これでVMインスタンス、Databaseにアクセスできました。しかし接続を確認してみるとCDB(コンテナデータベース)とあるのでPDBに切り替えます。

show con_name;

CON_NAME
-------------------
CDB$ROOT

PDB名を確認して、Alterで接続を変更します。

show pdbs
    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 DB_PDB1			  READ WRITE NO

alter session set container=db_pdb1;

Session altered.

PDBに接続できました。ここでユーザーの追加やテーブルの作成が行えます。

Blockchain Tableを作成

本命のBlockchain Tableを作成してみます。

Blockchain Tableを作成するためにはCREATE BLOCKCHAIN TABLEというDDL文を利用します。

試しに最も簡単な構成で作ってみます。

create blockchain table blockchain1 (col1 number(10) primary key, col2 varchar2(20), col3 varchar2(30)) 
no drop until 10 days idle 
no delete locked 
hashing using "sha2_512" version "v1";

1行目ではcreate blockchain table文でテーブルを作成し、通常のcreate table文と同様に列名と肩、制約を指定します。次のno drop until 10 days idleは10日以上更新がなかったらドロップを可能とすることを意味します。no deleteは削除を禁止し、lockedによりこの設定を後から変更できないようにしています。最後の1文hashing using “sha2_512” version “v1”では使用するhashアルゴリズムとバージョンを指定します。ここではsha2-512のversion v1を指定してます。

上記のようにcreate blockchain table文には以下3つの必須項目があります。

  • NO DROP [UNTIL n DAYS IDLE]
  • NO DELETE [LOCKED] もしくはNO DELETE UNTIL n DAYS AFTER INSERT [LOCKED] 
  • HASHING USING “sha2_512” VERSION “v1“ 

1つ目のNO DROPではドロップを禁止するか、ドロップが可能となる最後の更新からの最低日数を指定します。

2つ目のNO DELETEは削除を禁止するか、削除が可能となる行の挿入からの最低日数を指定します(最小値は16日)。LOCKEDをつけるとこの設定の変更が禁止されます。

3つ目のHASHING USING “sha2-512 ” VERSION “v1″はハッシュアルゴリズムとバージョンの指定をします。

*ちなみにBlockchain Tableを作成した直後、データを挿入する前はDROP TABLEでBlockchain Tableを削除することができます。1度データが挿入されるとユーザーもsysユーザーも削除することができなくなります。

作成後は通常のテーブルとして扱うことができ、データの挿入は従来のINSERT文で可能です。

Blockchain Tableに関するエラー

Blockchain Tableの作成や運用で実際に発生した(させた)エラーを紹介します。

ORA-00905: キーワードがありません。

先ほどBlockchain Table作成時に必須の項目があると書きましたが、それらを書き忘れるとORA-00905というエラーが発生します。

ORA-05716: ハッシュ処理アルゴリズムSHA2_256はサポートされていません

ハッシュ処理アルゴリズムの指定をSHA2-512としていましたが、他の暗号化に対応しているのか?と思い試してみましたが、SHA256で試した結果ORA-05716というエラーが発生しました。

ORA-05723: ブロックチェーン表BLOCKCHAIN1の削除は許可されません

作成したBlockchain Tableをdrop tableで削除しようとすると、ORA-05723というエラーが発生しました(until 16 days idleを指定して作成後3日後に実行)。

ORA-05715: ブロックチェーン表に対する操作は許可されません

作成したBlockchain Tableに追加した行をdeleteで削除しようとすると、ORA-05715というエラーが発生しました(no delete lockedを指定して作成)。

ORA-05732: 保存値は低くできません

alter table文でno drop until n days idleのn値をBlockchain Table作成時に定義した日数より小さくしようとすると、ORA-05732というエラーが発生します。10日から30日など値を大きくすることは可能です。テーブル作成時にno drop until n days idleを指定しない場合はalterで日数を追加することができず、同様のORA-05732エラーが発生します。

Blockchain Table隠しカラムについて

Blockchain Tableにはhash値が入っているはずなのに表示されない!と思われた方もいると思います。Blockchain Tableでは指定をせずとも複数の隠しカラム(列)が作成され、Insert時に自動的に挿入されます。

ここではいくつかのhidden columns(隠し列)を紹介します。

  • ORABCTAB_INST_ID$(インスタンスID)
  • ORABCTAB_CHAIN_ID$(チェーンID)
  • ORABCTAB_SEQ_NUM$(シーケンス番号)
  • ORABCTAB_CREATION_TIME$(作成時刻)
  • ORABCTAB_USER_NUMBER$(ユーザー番号)
  • ORABCTAB_HASH$(ハッシュ値)

上記以外にも電子署名の列等があります。

挿入された各行のこれらの値はSELECT文で確認することができます。

select ORABCTAB_INST_ID$ "inst", ORABCTAB_CHAIN_ID$ "chain", ORABCTAB_SEQ_NUM$ "seq", ORABCTAB_CREATION_TIME$ "time", ORABCTAB_USER_NUMBER$ "user", ORABCTAB_HASH$ "hash" from table1;

      inst      chain        seq time                                  user
---------- ---------- ---------- ------------------------------- ----------
        1         11          6 20-07-12 07:11:16.975343000 GMT        113 

hash                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
---------------------------------------------------------------------------------------
D56635216E192D891540C471DE22DD3379A445AF972C8ABA5AEC7136389317D593CB299C51DF9D77856DDD4DB28FE6612226D0E8423C61D5BB2B78640652BCF2

ORABCTAB_INST_ID$、ORABCTAB_CHAIN_ID$、ORABCTAB_SEQ_NUM$この三つの組み合わせがユニークになっており、この組み合わせが他の行と重複することはありません(どのインスタンスのどのチェーンの何番目か)。

WebアプリからBlockchain Tableへ接続

なんとなくBlockchain Tableが分かり、テーブルも作成できたので挿入したデータをウェブアプリからアクセスしてhtmlに表示させてみます。ウェブアプリと言ってもただのwebページです。

WebサーバーからPHPを使用してOracle Databaseにアクセスするため、事前にApache、Oracle Instant Client、OCI8のインストールを済ませておきます。こちらの過去記事やこちらに方法がありますので是非参考にしてみてください。

Blockchain TableはOracle Databaseの1テーブルにすぎないので通常の接続方法となんら変わりません。

oci_connect()を使ってデータベースにアクセスしています。OCIのAutonomous Databaseと異なりウォレットが必要ありません。

DBのユーザー名、パスワードに続いて接続記述子を書きます。接続記述子に関してはOCIコンソール画面から作成したDBaaSのデータベース、DB接続から確認できます。

上記の接続文字列はCDBルートとなっているためService名をPDBのサービス名に変更してください。PDBのサービス名はリスナーコントロールで確認できます。

lsnrctl status

LSNRCTL for Linux: Version 20.0.0.0.0 - Production on ~

Copyright (c) 1991, 2020, Oracle.  All rights reserved.

~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~

Service "pdbサービス名" has 1 instance(s).
  Instance "miyaBC", status READY, has 1 handler(s) for this service...

注意点としてOCIの同一VCN内からのアクセスの場合VCNのプライベートサブネットのセキュリティリストからイングレスの設定が必要です。1521ポートを登録してください。VCN外からIPアドレスでアクセスする場合はホスト名にパブリックIPアドレスを指定し、OCIからパブリックサブネットのセキュリティリストからイングレスの設定が必要です。*パブリックIPアドレスはDBaasの画面からリソース欄のノードで確認できます。

以下のようなPHPの記述になります(超簡易版)。

<?php
require_once 'ユーザー名とパスワードのあるファイル';

$c = oci_connect($usr, $pass, '(DESCRIPTION=(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)(ADDRESS_LIST=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=ip_address)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=pdb_servicename)))');

$s = oci_parse($c, "SELECT col1, col2, col3, ORABCTAB_INST_ID$, ORABCTAB_CHAIN_ID$, ORABCTAB_SEQ_NUM$, ORABCTAB_CREATION_TIME$, ORABCTAB_USER_NUMBER$, RAWTOHEX(ORABCTAB_HASH$) FROM table1");

$r = oci_execute($s);

echo "<table border='1'>n";
echo "<tr><th>COL1</th><th>COL2</th><th>COL3</th><th>INST_ID</th><th>CHAIN_ID</th><th>SEQ_NUM</th><th>CREATION_TIME</th><th>USER_NUM</th><th>HASH</th></tr>";

while ($row = oci_fetch_array($s, OCI_NUM)) {
 echo "<tr>n";
 foreach ($row as $item) {
 	echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "null") . "</td>n";
 	}
 echo "</tr>n";
}

echo "</table>n";

oci_execute($s);

oci_free_statement($s);
oci_close($c);

?>

コードを見て気づいた方もいると思いますが、HASH値はrow型で格納されているのでRAWTOHEX(ORABCTAB_HASH$)のようにキャストする必要があります。

上のコードを記述したPHPファイルをサーバー上にのせ、適当に挿入したでたらめなデータを表示しています。以下のようにチェーンIDやHASHも表示されています。*webアプリ上で隠しカラムを表示することはないと思いますが今回は試験的に表示しています。

これでWebアプリからBlockchain Tableにアクセスすることができました。

Blockchain Tableの特徴・用途について考察

最後にBlockchain Tableの特性や使い所を考えていきたいと思います。改めてBlockchain Tableの特徴は以下の通りです。

  • 従来のRDBシステムとして利用可能
  • 高い耐タンパ性(改ざん防止)

これに加えて中央集権型であるということです。こちらのドキュメントではBlockchain Tableの利点を次のように述べています。

  • ブロックチェーンネットワーク参加者による不正からアプリケーションの透明性保護を提供。不正は行のハッシュによって検知される
  • Oracle Databaseの一部であるため新たなインフラを必要としない
  • 現在稼働しているアーキテクチャ、プログラミングモデルをそのまま残し、既存の中央集権型のデータベースアプリをより安全にすることができる
  • 分散型ブロックチェーンと比べるとより簡単に利用できる

これまでのリレーショナルデータベースとして利用できるのがやはり利点と考えられます。新たに学ぶ要素も少なく学習コストが低く、これまでのアーキテクチャをそのまま利用することができるのが強いですね。

Blockchain Tableを一言で表すと「書き換え・削除ができない中央集権データベース」です。変更が効かないということは、内部の人も外部の人も一切変更ができないということになります。唯一方法があるとしたらPDBごと削除することです。

ブロックチェーンはデータの改ざんコストが高すぎるため改ざんの抑止となっている部分がありますが、Blockchain Tableは設計上どうあがいでも改ざんできません。until n days idleを付けなければ一切削除できなくなります。

ここにBlockchain Tableのキモがあると考えます。

用途考察1:公文書管理

用途としては少し前に話題となった公文書の管理が挙げられます。公文書の削除、改ざんを防ぎたい、しかしパブリックに公開して誰でも見られるようにするわけにもいかない。こう言った場合Blockchain Tableで中央集権的に保存管理する。これで削除してしまったので証拠を提供できないなんてことが起きなくなります。

用途考察2:アクセスログ管理

また、アクセスログを保存する際にBlockchain Tableを利用することで、外部からの不正アクセスのログをクラッカー自身に消させない。このようにデジタルフォレンジックに最適だと思います。

用途考察3:契約書

契約書にも使えると思います。細かい内容を含むことの多い契約書ですが、一度契約をした後契約内容の変更がない場合はBlockchain Tableで管理し、後で言った言わない問題を解決できます。もし契約内容の変更がある場合はNO DELETE UNTIL n DAYS AFTER INSERTを書くことで契約更新時の契約内容変更が可能となります。

以上のように、削除・改ざんのできない中央集権型のデータ管理の用途にBlockchain Tableが最適です。

Blockchain Tableのデメリット

一方デメリットもあります。

そもそも嘘や危険な内容をBlockchain Tableに書き込んだ場合、それを消すことができないというデメリットがあります。掲示板やSNSの書き込みをBlockchain Tableで管理した場合誹謗中傷やフェイクニュース等が削除できず、データベースに残ってしまいます。(そう言った投稿は非表示にするというやり方で回避できるかもしれません)

中央集権管理のため一箇所にあるデータベースごと消されることに対応できない。ブロックチェーン は分散型のため1ノード削除されても影響はありませんが、Blockchain TableはPDBごと消されてしまう危険性があります(ここのセキュリティは堅牢にする必要あり)。バックアップをとっていれば問題ないようにも見えますが、バックアップ先が通常のデータベースのテーブルだった場合、Blockchain Tableのデータベースを削除し、バックアップを改ざんされたら、改ざんされたデータが真とされてしまいます。

Blockchain Tableのバックアップを別のBlockchain Tableにとっておけばなんとかなりそうですが…

以上が私の考えるBlockchain Tableのデメリットです。

本当に万が一改ざん被害にあった場合はハッシュ値を外部に保存しておくことで、データの整合をとることができます。

おわりに

今回はOCIのDBaaS Oracle Database 20cプレビューの機能であるBlockchain Tableを扱ってみました。もっと実用的なアプリケーションに組み込んで、よりクリティカルな用途を考えていきたいと思います。

まだまだプレビュー版なので今後の情報更新が楽しみです。

本日も最後までご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました