CL

109. OWNER を利用した拡張的なコンパイル手法

IBM 解説書にも紹介されていない機密保護に関わる非常に有用なテクニックを紹介しよう。

それは実行環境で権限に制約されずにプログラムを実行させる方法である。
どういうことかと言うとあるプログラムを開発するにおいて、
開発環境では問題なく実行はできても実行環境で権限の制約を受けるため
実行されない場合がある。
例えば特殊権限として

*JOBCTL ジョブの変更などの権限
*SPLCTL 印刷スプールの変更に関わる権限
*ALLOBJ オブジェクトの使用権限

これ以外にも *AUDIT, *IOSYSCFG, *SAVSYS, *SECADM, *SERVICE などがある。
あなたが開発したプログラム内で CHGJOB コマンドを使用していて、
どうしても実行には *JOBCTL 権限が必要であるとする。
これは*JOBCTL権限が必要なのですべての社内ユーザーに*JOBCTL権限を
与えるだろうか ?
それは手間がかかるだけでなくとても危険なことである。

( すべてのユーザーに *SECADM権限を与えている法人があったが
このような危険な設定は論外であろう。)

方法を紹介しよう。それは簡単である。
CRTPGMCRTBNDRPG などで

    ユーザープロフィール ............. *OWNER

を指定することである。

プログラムのユーザー・プロフィール・パラメータは通常では *USERである。
これはプログラムの実行権限が実行時のユーザーに依存することを意味している。
これに対して *OWNERとはプログフラムの所有者に依存することを意味している。
プログラムが別の環境に RSTOBJなどで復元された場合には作成したときの
所有者と同じユーザーがいなければ所有者は QDFTOWN という省略時の
所有者となるのだが、ここで注目すべき点は所有者とは実行環境の所有者ではなく

プログラムを作成したときの所有者の持つ権限

が与えられることである。

つまり開発環境のユーザーが*JOBCTL権限を持っていたのであれば
*OWNER にしておけばプログラムの実行時にも *JOBCTL 権限が与えられて動作する、
ということである。
おわかりだろうか?

つまり*OWNERとしてコンパイルすれば開発環境で動作したのであれば
実行環境でも権限のエラーとして実行エラーとなることはない

ということである。

弊社製品では内部でかなりの数の API を使って動作を実現している。
中には IBM Knowledge Center には公開されていない(しかし IBM の) API を
使っている場合もある。
しかし弊社製品を動作させるユーザーが必ずしも十分な実行権限を有していない場合もある。
本来ならば権限がないというエラーにすべきである。
例えば機密保護の設定コマンドの利用では使用権減のない
ユーザーでは使用できないように設定している。
しかしどうしても権限の制約を受けずに実行させたい機能に関しては
いくつかはこの *OWNER を使ってどのユーザーでも使用可能になるように工夫している。
権限の制約を回避する方法として問題が生じたときにこの方法を試してもらえれば幸いである。

なお *OWNERとして最初だけコンパイルすれば以降のコンパイルで
*OWNERとするのを忘れて *USER としてコンパイルしても問題はない。
*OWNER属性は引き継がれていくので*USERとしてコンパイルしても
*OWNER属性はそのまま残る。
*OWNER属性を取り消したい場合だけDLTPGMしてから再コンパイルすればよい。