強化された JCL セキュリティ チェック

注: 次の説明はネイティブ COBOL アプリケーションにのみ該当します。

リリース 9.0 では、JCL エンジンが拡張され、プログラム実行時のセキュリティが強化されました。以前は、ビルドされたプログラムは、JES プログラム パスとして識別される場所か、カタログで動的 PDS として識別され、ジョブで STEPLIB または JOBLIB として使用される場所に配置されていました。これらの場所は引き続き使用でき、既存の構成設定を変更しなくても機能します。

一方で、メイン ユーティリティおよびユーザー プログラムのロード元の場所を識別されるデータセットのセットに制限することで、セキュリティを強化できるようになりました。それらのデータセットを変更するアクセス権を持つユーザーを制限することもできます。これらの変更により、JES プログラム パスまたは動的 PDS の場所にあるという理由だけで、悪意のあるプログラムが選択されたり使用されたりするのを難しくすることができます。

引き続き以前の構成を使用する場合、強化されたセキュリティが有効になっていると、特定の場所からプログラムがロードされない可能性があることを示す警告メッセージが表示されます。これらは、システムを保護するためにより高いレベルのセキュリティに移行するときに何を変更する必要があるかを示すガイドとなります。

9.0 以降、2 つの新しいセキュリティ レベルが利用可能になりました。

ロードするプログラムの検索とそのプログラムへのアクセスのチェックでは、プログラムのエイリアス (設定されている場合) が使用されます。これにより、たとえば IDCAMS のエイリアスが MFJAMS から MYPROG に変更された場合、MYPROG に対して検索とチェックが行われます。JCL ジョブから呼び出されるメイン プログラム以外のプログラムについては、JES プログラム パスを引き続き使用することができ、その場所からプログラムがロードされます。ロードとチェックは、JCL ジョブで識別されたプログラムに対して行われます。そのため、各プログラムが PO に個別のエントリとして存在している必要があります。エントリの PC-DSN は、ロードする実際のプログラムを指す必要があります。そのプログラムで他のプログラムを呼び出す場合、STEPLIB、JOBLIB、SYS1.LNKLIB、または JES プログラム パスのいずれにあるプログラムも呼び出すことができます。

重要: ロードするプログラムを保持する PO に対する ALTER アクセス権は、承認されたユーザー (管理者) のみに付与する必要があります。これにより、悪意のあるユーザーによって内容が変更されることがなくなります。

プログラムを保持する PDS は、データベースでホストされているデータを使用して実行する場合でも、ディスクベースである必要があります。システムはデータベースの場所からプログラムをロードできません。

製品サンプルの場所の Mainframe\JCL\Classic サブフォルダー (Windows) および $COBDIR/demo (UNIX) に、jcl-symbols の例が用意されています。サンプルの INITSYS.JCLINITSYS2.JCL、および MOVEPGMS.JCL ファイルを使用して、システム プログラムを保持するライブラリを設定し、ビルドされたモジュールをそれらのライブラリに移動できます。詳細については、サンプルの Readme ファイルを確認してください。

この例を実行する方法は次のとおりです。

  1. ESCWA で、JCL 対応リージョンを作成します。
  2. プログラムをコンパイルし、[JES Program Path] の場所に追加します。

    MOVEPGMS.JCL/home/sysadmin/libs/ (UNIX) のプログラムを検索しますが、[JES Program Path] で識別されるすべての場所が対象になります。

  3. リージョンを起動します。

    初めて起動した場合、SYS1.LNKLIB エントリがないことを示す警告メッセージがコンソール ログに書き込まれます。

    JES000067W JES Validation - 0 SYS1.LNKLIB entries.
  4. INITSYS.JCL を実行します。

    これにより、システム起動時にロードするプログラム データセットを記述するシンボルと一連の SYS1.PARMLIB メンバーが作成されます。

  5. INITSYS2.JCL を実行して、それらのデータセットを作成します。

    SYS1.LNKLIB のリストに、SYS1.LNKLIB、SYS1.PROGLIB、SYS2.LNKLIB、および MFI01.MFITEST.LIB の 4 つのデータセットが表示されます。

    SYS1.PARMLIB(LNKLST02) で指定される SYS1.MFTEST.LIB(TEST1) については、member(TEST1) がまだ作成されていないため表示されないことに注意してください。同様に、SYS1.LNKLIB の連結にリストされる他のデータセットについても、それらがカタログにも存在していない限り表示されません。それらを作成し、後でロード モジュールを取り込むことができます。

  6. SYMBOL6.JCL サンプル ジョブを実行します。ジョブの JESYSMSG を確認してください。

    各ユーティリティ プログラムのロード元を示すメッセージに、プログラム CALLMFJZ がプライベート ライブラリおよび SYS1.LNKLIB で見つからなかったことを示すメッセージが含まれています。ライブラリをリストするメッセージもあります。

    JCLCM0305W Failed to find program CALLMFJZ in private libraries and SYS1.LNKLIB. 
    JCLCM0306I Number of SYS1.LNKLIB entries:         3. 
    JCLCM0307I SYS1.LNKLIB : SYS1.PROGLIB,SYS2.LNKLIB,MFI01.MFITEST.LIB.

    ただし、より高いセキュリティ レベルが設定されていないため、システムは JES プログラム パスでプログラムを検索し、次のプログラムを見つけます。

    JCLCM0303I Program CALLMFJZ loaded from library SYS2.LOADLIB
    JCLCM0199I Program CALLMFJZ  is COBOL ANS85 ASCII  Big-Endian    NOAMODE.

    MOVEPGMS.JCL を使用して、ビルド場所から PO データセットにプログラムをコピーできます。

    この例のジョブでは、DEF1 データセットは、/home/sysadmin/libs/ フォルダー内のすべての *.dll ファイル (Windows) または *.so プログラム (UNIX) をメンバーとして持つ動的 PDS として定義されています。STEP10 で、MFPOADD ユーティリティを使用して、システム プログラム ライブラリとして識別されている標準の PO SYS1.PROGLIB に動的 PDS の一部のメンバーがコピーされます。MFPOADD は IEBCOPY (MFJCOPY) のバリアントであり、MOVEPGMS.JCL の手順の例に示されているように IEBCOPY 制御文を受け入れます。

  7. MOVEPGMS.JCL を実行して、INITSY2.JCL で定義された場所にプログラムを移動します。これを実行する前に、一時的な動的 PDS DEF1 の場所をビルドされたプログラムを配置した場所に変更してください。
  8. プログラムが SYS1.PROGLIB データセットに存在することを確認します。カタログのリストに表示されるはずです。

    UNIX で実行している場合は、元の場所からコピーしたときにプログラムの権限が失われている可能性があります。その場合は、実行可能として設定する必要があります。

  9. SYMBOL6.JCL を再度実行すると、CALLMFJZ が SYS1.PROGLIB からロードされたことがわかります。
  10. リージョンを停止し、リージョン定義の [ES Configuration] セクションに次のエントリを追加します。
    [ES-Environment]
    ES_JES_HIGHER_SECURITY_LEVEL=2
  11. リージョンを起動し、console.log を確認します。

    次のメッセージが表示されます。

    ES000067I JES Validation -         5 SYS1.LNKLIB entries. 
    JES000068I SYS1.LNKLST: SYS1.PROGLIB,SYS2.LNKLIB,MFI01.MFITEST.LIB,SYS1.MFTEST.LIB(TEST1),SYS2.U30LIB

    これらは、SYS1.LNKLIB の連結に 5 つのエントリがあることを示しています。IDCAMS LISTCAT ENTRIES(SYS1.LNKLIB) を実行するとわかるように、これらのエントリのすべてがカタログに存在するわけではないことに注意してください。

  12. SYMBOL6.JCL を再度実行します。

    次のメッセージが表示されます。

    Program IEBGENER (MFJGENER) loaded from library SYS1.LOADLIB
    Program CALLMFJZ loaded from library SYS1.PROGLIB
  13. カタログ ビューで SYS1.PROGLIB PO から CALLMFJZ メンバーを削除し、SYMBOL6.JCL を再度実行します。

    次のメッセージが表示されます。

    Failed to find program CALLMFJZ in private libraries and SYS1.LNKLIB

    プログラムがまだ JES プログラム パスにある場合でも、定義されているいずれかのシステム ライブラリかプライベートの JOBLIB または STEPLIB ライブラリに含まれていない限り、そのプログラムは使用されません。

    上記のプログラム ロード メッセージでは、シンボリック名 SYS1.LOADLIB は、プログラムが製品からロードされたことを示しています。SYS2.LOADLIB は JES プログラム パスを示します。