IBM 解説書にも紹介されていない機密保護に関わる非常に有用なテクニックを紹介しよう。
それは実行環境で権限に制約されずにプログラムを実行させる方法である。
どういうことかと言うとあるプログラムを開発するにおいて、
開発環境では問題なく実行はできても実行環境で権限の制約を受けるため
実行されない場合がある。
例えば特殊権限として
*JOBCTL | ジョブの変更などの権限 |
---|---|
*SPLCTL | 印刷スプールの変更に関わる権限 |
*ALLOBJ | オブジェクトの使用権限 |
これ以外にも *AUDIT
, *IOSYSCFG
, *SAVSYS
, *SECADM
, *SERVICE
などがある。
あなたが開発したプログラム内で CHGJOB
コマンドを使用していて、
どうしても実行には *JOBCTL
権限が必要であるとする。
これは*JOBCTL
権限が必要なのですべての社内ユーザーに*JOBCTL
権限を
与えるだろうか ?
それは手間がかかるだけでなくとても危険なことである。
( すべてのユーザーに *SECADM
権限を与えている法人があったが
このような危険な設定は論外であろう。)
方法を紹介しよう。それは簡単である。
CRTPGM
や CRTBNDRPG
などで
ユーザープロフィール ............. *OWNER
を指定することである。
プログラムのユーザー・プロフィール・パラメータは通常では *USER
である。
これはプログラムの実行権限が実行時のユーザーに依存することを意味している。
これに対して *OWNER
とはプログフラムの所有者に依存することを意味している。
プログラムが別の環境に RSTOBJ
などで復元された場合には作成したときの
所有者と同じユーザーがいなければ所有者は QDFTOWN
という省略時の
所有者となるのだが、ここで注目すべき点は所有者とは実行環境の所有者ではなく
が与えられることである。
つまり開発環境のユーザーが*JOBCTL
権限を持っていたのであれば
*OWNER
にしておけばプログラムの実行時にも *JOBCTL
権限が与えられて動作する、
ということである。
おわかりだろうか?
つまり*OWNER
としてコンパイルすれば開発環境で動作したのであれば
実行環境でも権限のエラーとして実行エラーとなることはない
ということである。
弊社製品では内部でかなりの数の API を使って動作を実現している。
中には IBM Knowledge Center には公開されていない(しかし IBM の) API を
使っている場合もある。
しかし弊社製品を動作させるユーザーが必ずしも十分な実行権限を有していない場合もある。
本来ならば権限がないというエラーにすべきである。
例えば機密保護の設定コマンドの利用では使用権減のない
ユーザーでは使用できないように設定している。
しかしどうしても権限の制約を受けずに実行させたい機能に関しては
いくつかはこの *OWNER
を使ってどのユーザーでも使用可能になるように工夫している。
権限の制約を回避する方法として問題が生じたときにこの方法を試してもらえれば幸いである。
なお *OWNER
として最初だけコンパイルすれば以降のコンパイルで
*OWNER
とするのを忘れて *USER
としてコンパイルしても問題はない。
*OWNER
属性は引き継がれていくので*USER
としてコンパイルしても
*OWNER
属性はそのまま残る。
*OWNER
属性を取り消したい場合だけDLTPGM
してから再コンパイルすればよい。