IBM iコマンド・インタフェースでMySQLの機能を利用する
CLとRPGを使用して安全な接続を簡単に構築する
最近IBMDB2Iストレージ・エンジンについて学ぶ機会がありました。IBM i上でMySQLを使用する研修をいくつか受けた後、いくつかのMySQL機能を実行するCLコマンドのフロントエンドを作っておくと便利かもしれないと思いました。本稿ではMySQLの機能を簡単に使用できるようにしたIBM i上で実行する私が作ったコマンドについて説明します。このコマンドを使用すると、CLやRPGを使用してIBM i上でMySQLへの安全な接続を構築することができます。私が作成したコマンドは、データベースから、作業管理やセキュリティにいたるまでカバーしており、将来的にはMySQL機能をさらに追加することで簡単に拡張できるように設計されています。
私が作成したコマンド・ユーティリティはMYSQLという名前ですが、データベースの名前であるMySQLと混同しないでください。MYSQLを使用するにはIBM i上にMySQLデータベースが必要です。IBM i上の特定のバージョンのMySQLだけがIBMDB2Iストレージ・エンジンをサポートしています。私の場合はv5.1.44を使用しています。もう一つの前提条件は、IBMのライセンス・プログラム製品であるIBM Tools for Developers for IBM i (ライセンス・プログラム製品番号Q5799PTL)があることです。この製品はIBMから無料で入手でき、ウェブ・ブラウザで「IBM Tools for Developers for IBM i」で検索すれば簡単に見つかります。この製品をダウンロードするにはIBM IDが必要となります。インストール手順の説明もIBMからダウンロードしたzipファイルの中に含まれています。
コマンド・インタフェース概要
MYSQLコマンド・インタフェースの概要から説明します。このコマンドには、図―1に示した通り4つのパラメータを定義しました。最初のパラメータMYSQL_PRCは実行するMySQLプロセスを選択する際に使用します。このパラメータに指定できる値は図―2に示されています。選択できる値はMySQLにおける管理者または開発者の権限に依存します。コマンド処理プログラムは現在のジョブ・ユーザーのプロファイルの特殊権限セクションに*ALLOBJがあるかを調べます。これによりそのユーザーが利用できるMySQL関数が決まります。
MYSQL_PRCパラメータに*TIPSという値を与えてMYSQLを実行した時の出力の例を図―3に示します。*TIPSは一部のMySQL関数や文法に関する有益な注意事項のリストを提供してくれます。出力されたヒントの文章を修正してMySQLの使用上のヒントをIBM iの開発者向けにカスタマイズすることができます。私のヒントは以下を実行する方法を一覧にしています。
- QP2TERMを使用してMySQL環境に接続し、環境から抜け出す方法。
- 「SYSINEWS」という名前のMySQLデータベースを(QSYS.LIBではなくMySQL中に)作成する方法。
- そのデータベースをMySQLで使用する方法。
- MySQLからIBMDB2Iストレージ・エンジン経由でSYSINEWSという名前のQSYS.LIBライブラリへのリンクを定義する方法(Create Table文)。
- 図―4に示すようなcreate tableの出力を表示する方法。
MYSQLコマンドを実行したときのもう1つの出力例を図―5に示します。MySQLのバージョン番号を取得するため、MYSQL_PRCパラメータに*DSPVERという値を指定してMYSQLコマンドを実行しました。
*RUNSCRIPTオプションを使用するにはMySQLのユーザーとパスワードが必要となります。これらの値を渡すにはMYSQL_USRパラメータとMYSQL_PWDパラメータを使用します。ユーザーとパスワードはMySQLデータベース中の値に基づくものであり、IBM iのユーザー・プロファイル名とパスワードに基づくものではありません。ちなみに、IBM iのユーザー・プロファイルのパスワードを変更してもIBM iのMySQLデータベースのパスワードは失効しないということをたまたま発見しました。
コマンドがサポートする管理タスク
図―2に示した通り、MYSQL_PRCパラメータに指定した値に基づいてこのコマンドを使用して遂行できる管理タスクは5つあります。*CRTUSR、*DLTUSR、*CHGUSRPWDはMySQLユーザーの処理をするのに使用します。これらのオプションは*DSPVERオプションに加えて、以下に示す通りWrite Stream File (WRTSTMF)コマンドを使用します。
管理タスク*STARTと*END
MYSQLコマンドを思い通りに実行できることがわかると、*STARTおよび*ENDについて、特にこれらのオプションをスケジューリング・システムに組み入れている場合には、IBM iの管理者と検討したくなるでしょう。ここで重要な注意事項があります。*STARTオプションを使用してMYSQLを実行すると対話型のジョブが使用できなくなりますので、適切なIBM iサービス・アカウントを使用して*STARTオプションをバッチで発行してください。
ソースコード中に提供されているドキュメントを読んでください。*STARTプロセスと*ENDプロセスがRPGコマンド処理プログラム中でどのように定義されているかを図―6に示します。 MYSQL_RPGプログラムは*STARTと*ENDを実行するのに必要な前提条件項目、特にスコット・クレメント氏がscottklement.com/unixcmdで提供しているUnixCmd APIを参照します。
MYSQLコマンド処理プログラム概要
私の部門のMySQL用のIFSディレクトリは/QOpenSys/usr/local/mysql/mysqlです。皆さんの部門でのMySQLのインストール先ディレクトリがこれと異なる場合は、MYSQL_RPGプログラム中のRPG定数IfsDirを調整してお使いのIFSディレクトリ・パスに一致させる必要があります。
IBM i上のMySQLはQP2SHELLジョブとして実行されるので、注意しておくべき点がいくつかあります。MySQLデータベースがIBM i上で起動するとき、Batch Immediate (BCI)ジョブがPGM-mysqldという関数を使用して、QP2SHELLという名前のWRKACTJOB内で起動します。以後、PGM-mysqldを使用した追加のQP2SHELLジョブはIBM i上のMySQLを使用するときに競合を発生することがあります。IBM i上で対話型のMySQLセッションを起動するときに、PGM-mysqlという関数を使用して新しいBatch Immediate QP2SHELLジョブを発生させます。
Write Stream File処理
一部のコマンド・オプションは一時的なMySQLスクリプトを作成します。このスクリプトはIFSフォルダ/tmp/scripts/_上に作成されます。一時スクリプトはその実行後に即座に削除されますので、IFS中に留まることはありません。たとえば図―7に示したのは、MYSQLコマンドの*CRTUSRオプションを処理するためにMYSQL_RPGコマンド処理プログラム中で作成された一時スクリプトです。
スクリプト・ファイルを簡単に書けるようにするためにWRTSTMFコマンドを作成しました。このコマンドにはパラメータが数個あるだけです。WRTSTMFコマンドはIFS中にファイルを作成するときと、そのファイルに文字列を書くときとの両方の場合に使用します。たとえば、下記のWRTSTMFの使用では.sqlという拡張子を持ったテキスト・ファイルが作成され、そのファイルに対して短いMySQLスクリプトが書き込まれています。
WRTSTMF TEXTSTRING('show plugins;')
IFSDIR('/home/kcoldon')
IFSSTMF('Show_MySQL_Plugins.sql')
ENDLINFMT(*CRLF)
STMFOPT(*REPLACE)
このスクリプトは以下のMYSQLコマンドを使用して実行します。
MYSQL MYSQL_PRC(*RUNSCRIPT)
MYSQL_USR(kcoldon)
MYSQL_PWD()
SCRIPT('/home/kcoldon/Show_MySQL_Plugins.sql')
このMYSQLコマンドを実行して得られる出力を図―8に示します。MYSQLコマンドを実行するのはジョブ中のスプール・ファイルです。
データベース接続vaultの設計
安全なMySQLサーバー接続を確立するために私はデータベース接続vaultの概念と、IFSフォルダ構造中で作成され削除されるMySQLの一時スクリプトを整理して終了させるのとを組み合わせて使用します。アプリケーションの安全性はデータベース接続vault処理の中に組み込まれています。このデータベース接続vault処理は、プログラムの呼び出しスタックを見て呼び出しプログラムがSQLテーブルDBPGMVLT中で定義されているかどうかを検証します。定義されていない場合は、データベース接続vault経由で抽出されるデータはありません。
私が作成したデータベース接続vaultコードを使用する場合は、最低でもSQLテーブルのDBCNNVLT中のパスワード列を安全に保つため、皆さんの部門固有の暗号化/復号化技術をおそらく追加されるでしょう。データベース接続vaultで使用されている2つのSQLテーブルをジャーナルする場合は、その2つのテーブル用に使用しているジャーナル・オブジェクトと、ジャーナルおよびジャーナル・レシーバを分離したほうがよいでしょう。ソフトウェアをベースとした複製方法を使用してIBM iシステムをミラーリング化している場合は、対象とするIBM iシステムでもテーブルに対して適切なセキュリティ策が講じられていることを確認してください。
ユーザーIDとパスワードをRPG変数に割り当てるときは、その変数がデバッガで見えてしまうという点に注意してください。ソースコードのコンパイル・パラメータ例を参照して、CNNVAULTプログラム・オブジェクトとMYSQL_RPG SQLRPGLEプログラム・オブジェクトに対する「デバッグを許可する」というオプションに制限を加えてください。
MySQL以外のデータベースを使用する際のデータベース接続vaultの拡張
データベース接続vaultのSQLテーブルを使用して、SQL以外のタイプのデータベースへの接続プロパティと接続パラメータを保存することもできます。SQLテーブルDBCNNVLTのスキーマを図―9に示します。このスキーマにはユーザーとパスワードを保存するための列だけでなく、データベース名、サーバー名、サーバー・タイプ、サーバー接続ポート、接続ドライバ情報(たとえばIFS中のJDBCドライバの位置)を保存する列もあります。
新しいデータベース接続をDBCNNVLTテーブル中に定義することで、IBM iのデータベース接続vaultロジックをMicrosoft SQLサーバー・データベース接続で使用しました。次に、テーブルDBPGMVLT中のデータを抽出するプログラムを書きました。たとえば、私が作成したあるRPGプログラムはIFS中の固定位置にあるJDBCドライバ用のJDBC接続文字列を使用しています。DBPGMVLTからレコードを抽出したら、抽出した接続プロパティをRPGプログラム中で使用して、SQLサーバーに対してデータベースにアクセスするための接続を作成します。許可されるアクセス権はSQLサーバーで定義されているユーザーのユーザー権限に依存します。データベース接続vault技術を使用するより詳細な内容についてはMYSQL_RPGプログラムのソースコードで確認してください。
ロックダウン・オブジェクト処理
QSYS.LIBオブジェクトを安全に保つには、オブジェクトの所有者、プライベートな権限、権限リスト、不正なアクセスを制限するためのその他の要因が適切に調整されている必要があります。これを行うにはさまざまな方法があります。私は「ロックダウン・オブジェクト」というユーティリティを作成してこの安全性を実装するのに役立てるようにしました。
私が作成したロックダウン・オブジェクト(LCKDWNOBJ)コマンドは既存のIBM iのセキュリティを補完するだけであるということは、ここで強調してもし過ぎることはありません。このコマンドはIBM i上のオブジェクト・レベルのセキュリティや全体的なセキュリティ機能の代わりとなるものではありません。本稿に記載されているオブジェクトを適切なセキュリティのもとで使用することについてIBM iのセキュリティ管理者と話し合ってください。たとえば、IBM iのセキュリティ管理者がLCKDWNOBJのアプローチを使用せず他の方法を取ろうとしているかもしれません。
図―10に示したLCKDWNOBJコマンドはQSYS.LIBシステム・オブジェクトに対してのみ動作します。このコマンドは権限を上げた特権ユーザーとして*EXCLUDEアクセスを持つユーザーを追加します。*ALLOBJの特殊権限を持つプロファイルを制限できないということを覚えておいてください。このLCKDWNOBJコマンドは、グループ・プロファイルのメンバーがそのプロファイル中に*ALLOBJを有していなければ、そのメンバーへのアクセスを無効にするためのスクリプトをすばやく書くときに便利です。権限を上げた特権ユーザーとみなしているのは以下です。皆さんの部門で必要となるLCKDWN_RPGコマンド処理プログラムに調整をする際に役立つかもしれません。
- ユーザー・クラス*SECOFRまたは*SECADM
- *ALLOBJ、*SECADMを有する特殊権限
- QSECOFRの主グループ・プロファイルまたは補足グループ・プロファイル
このCLコマンドにはALWUSRPF (Allow User Profile)という名前のパラメータが含まれています。このパラメータを使用すると、特定のユーザー・プロファイルがグループ・プロファイルから除外されていたとしてもオブジェクトにアクセスできるようにすることができます。
文字Qで始まるユーザー・プロファイルを作成できるのはIBMだけです。LCKDWNOBJコマンドは文字Qで始まり前述の権限を上げた特殊基準に合致したすべてのユーザー・プロファイルを検証します。Qユーザー・プロファイルが*IBMというユーザーによって作成されたものであれば、そのプロファイルはアクセスを許可されます。
他の製品を使用してMySQL機能を拡張する
MYSQLコマンドは他の製品と組み合わせて使用できるよう十分柔軟な設計となっています。たとえば、皆さんの部門ではIBM i、Windows、UNIXなどといった複数のプラットフォームに渡るアカウント・プロビジョニングとパスワード管理用セキュリティ製品を使用している場合があるでしょう。MYSQLコマンドのコマンド処理プログラムを修正することで、既存のセキュリティ・インフラストラクチャーに基づいた*CRTUSR、*DLTUSR、*CHGUSRPWDなどの機能との同期を組み入れることができます。
まとめ
MYSQLコマンドのさまざまな機能について説明しましたので、皆さんのIBM iシステム上でそれらが使用できるようにするためのチェックリストを以下に掲載します。
- ソースコードをIBM i上の選択したライブラリにアップロードします(SYSINEWSという私のデフォルトの名前をご自分のライブラリ名に置き換えてください)。
- 2つのデータベース接続vault SQLテーブルであるDBCNNVLTとDBPGMVLTを高いセキュリティを持つユーザー・プロファイルを使用して安全なものにします。
- LCKDWNOBJコマンドを使用して2つのデータベース接続vaultテーブルをロックダウンします。
- DBPGMVLT SQLテーブル(データ接続vaultプロパティ・テーブルを取り出すための権限を有したプログラム)に、RPGプログラムMYSQL_RPG用にレコードを追加します。
- 部門固有の暗号化/復号化技術をDBCNNVLTのパスワード列に追加します。
- 接続コードMySQL_Root、接続ユーザーroot、大文字と小文字を区別する接続パスワード(部門のMySQL IBM iをインストールした人から提供してもらう)を使用してDBCNNVLT SQLテーブル(データベース接続vaultプロパティ・テーブル)にレコードを追加します。
*ALLOBJ特殊権限を有するIBM iのユーザー・プロファイルでサイン・オンします。MYSQLコマンドに*STARTオプションを付けて実行するとIBM i上でMySQLプロセスを起動できるはずです。
本稿でMYSQLコマンドを使用してIBM iへのセキュアなMySQL接続をより簡単に作成する方法があることがおわかりいただけたかと思います。MYSQLコマンドを使用することで簡単なコマンド・レベルでMySQL管理機能へアクセスすることが可能になりました。MYSQLコマンドが有用でご自分の部門用に改良できることをおわかりになっていただけたらと思います。