今回はIBM i OSの出口点(Exit Point)についてご紹介いたします。
近年、ITセキュリティー強化は非常に差し迫ったテーマとして取り上げられています。ランサムウェア攻撃などによる実害(システム障害やデータ漏洩)が多発している、という実態がその背景です。(図1)
IBM i は長年にわたり、最も安全なシステム基盤として評価されてきましたが、IBM i であっても現代的なセキュリティー脅威に対応するべくシステムセキュリティーの最適化(見直しや強化)は必須と言えるでしょう。
IBM i 7.5以降ではQSECURITY 20が原則廃止されました。また、システム提供オブジェクトへのアクセスについても従来の*CHANGE, *ALL権限であったものを*USE権限に厳格化しています。今回ご紹介する出口プログラムの実行における権限チェックもより厳格化されているなど全方面に渡りセキュリティーの見直しが行われています。
IBM i OSの出口点(出口プログラム)は現代的なセキュリティー課題に対応させたい場合、非常に効率的に要件を実装できる可能性があります。
IBM i OS 出口点(Exit Point)、出口プログラム(Exit Program)とは
出口点は、IBM i の機能を実行する前・後にユーザー作成のロジック(出口プログラム)を登録して実行させるものです。
ユーザー作成ロジックで、クライアントのユーザーIDやIPアドレスその他情報を基に、IBM i 機能の動作をより細かく制御・抑制することを目的としています。(図2)
昨今のIBM i は、クラウドにおけるIBM Power Virtual Server(PowerVS)を筆頭とするパブリックなネットワークや、従来とは異なる様々なネットワーク経路からアクセスされるケースが増えています。この現代的なアクセス環境においては、クライアントの属性を確認して許可する機能やIBM i 上の実行環境を制限することにより、セキュリティー改善(未然防止)に大きな効果が期待できます。
出口点はOS/400時代から存在していますが、その数は以前より増えており、執筆時点(2024年8月)のIBM i 7.5では、約130ほどの出口点が利用可能です。出口点を備えたIBM i OS機能には、リモートからのプログラム実行、Db2 for i へのデータベース操作、IFS操作、TCP/IP通信・サーバー関連機能、ユーザーID操作のほか、PowerHA操作やBRMSに対応するものまで広範囲に存在します。
出口点は WRKREGINF コマンドで確認・出口プログラム登録が可能です(後述)。以下では、具体的なシナリオを設定して出口点、出口プログラムを作成し、動作検証してみます。
出口点・出口プログラムのサンプル・シナリオ
(1)IBM i FTPサーバーに匿名ユーザー(ANONYMOUS)でログイン可能化する
(2)ログインするFTPユーザーに応じてFTPの現行ディレクトリ(ワーキングディレクトリ)を変更するが、ANONYMOUSユーザーはライブラリーPUBLICにディレクトリーを限定する
(3)ログインするFTPユーザーに応じて実行可能なFTPサブコマンド(PUTやGETなど)を制限する。ANONYMOUSユーザーにおいてはIBM i OSへのPUT=アップロードは許可しない。(GET=ダウンロードは許可)
(1)の匿名ユーザーANONYMOUSは、IBM i OSのデフォルトでは利用不可になっています。また、IBM i の場合、ANONYMOUSユーザーでFTPサーバーログインする為には、今回ご紹介する2つの出口点に出口プログラムを登録する必要があります。
以上のシナリオを実現する設定例をご紹介します。全体像は図3のようになります。
各ステップの説明
ステップ① ユーザー ANONYMOUS
- 一般に匿名ユーザーと呼ばれる、パスワード無しのユーザーIDです。IBM i ではデフォルトでユーザー・プロファイル自体が存在しないので作成します。
ステップ② 出口点 QIBM_QTMF_SVR_LOGO
- FTPサーバーにログインした際に実行される出口点です。今回はCLPで作成したサンプルプログラムをこの出口点に出口プログラムとして登録します。
- 出口プログラム中ではANONYMOUSユーザーは専用のライブラリー(PUBLIC)を現行ディレクトリとして割当します。
- ANONYMOUS以外のユーザーは其々のユーザー・プロファイルのデフォルト設定に従って現行ディレクトリーが設定されます。(出口プロラムではハンドリングしない)
ステップ③ 出口点 QIBM_QTMF_SERVER_REQ
- FTPサーバーにログインした後に実行されるユーザー作成ロジックを登録する出口点です。今回はCLPのサンプルをこの出口プログラムとして登録します。
- 出口プログラム中では、ANONYMOUSユーザーはIBM i サーバーにPUTができないように設定します。また現行ディレクトリも②で指定したライブラリーPUBLIC以外に変更できないように制限されます。
- ANONYMOUS以外のユーザーについては制限を加えません。
ステップ④ アクセスするライブラリー、ファイル等への適切な権限付与
- 特にANONYMOUSユーザーへの不必要な権限付与はセキュリティーリスクとなるため、最小限のアクセス権を付与するように心がけます。具体的にはライブラリーPUBLICや同ライブラリー内のファイルの権限を最小限度に設定します。
- 必要に応じて他のユーザーにも適切なアクセス権限を付与します。
サンプル設定例
以下、図3のシナリオに従って順番に設定していきます。
手順① ユーザー ANONYMOUSの作成
ステップ① ユーザー ANONYMOUS
以下のコマンドを実行して、ユーザー・プロファイル ANONYMOUS を作成します。
CRTUSRPRF USRPRF(ANONYMOUS) PASSWORD(*NONE) CURLIB(PUBLIC) TEXT('ANONYMOUS USER') HOMEDIR('/home/ANONYMOUS')
- パスワードは*NONEを指定します。
- 現行ライブラリーは②出口プログラムで指定する現行ライブラリーと同一のPUBLICを指定します。
- HOMEDIR のデフォルトは上記例のとおり /home/ユーザー・プロファイル名 と指定します。もしも貴社システムで別の設定ルールが採用されている場合は、そのルールに従ってANONYMOUSユーザー用IFSフォルダーを作成してください。
MKDIR DIR('/home/ANONYMOUS')
また、現行ライブラリーも存在しない場合、エラーとなりますので、下記例のように作成してください。
CRTLIB LIB(PUBLIC)
手順② FTPサーバーログイン時の出口プログラムの作成
続いて1つ目の出口プログラムを作成します。出口点 QIBM_QTMF_SVR_LOGONの目的は、FTPサーバーにログインするユーザー・プロファイルを判断して、ANONYMOUSユーザーの場合、現行ライブラリーをPUBLICに設定する事です。
※この後に作成する2つ目の出口プログラムでは、ANONYMOUSユーザーは別の現行ライブラリー(ディレクトリー)に変更できないようにすることで、PUBLICライブラリーのみの利用に限定できます。
※出口点 QIBM_QTMF_SVR_LOGONには3種類の出口点形式があります。3種類それぞれで制御できる条件が異なります。今回はTCPL0100という出口点形式を使用します。
FTPサーバーログイン時の出口プログラムはサンプルが提供されています。CLPのサンプルは下記のページから入手できます。(ILE RPG, Cのサンプルも提供されています)
例: CL コードで作成された FTP サーバー・ログオン出口プログラム
https://www.ibm.com/docs/ja/i/7.5?topic=fslep-example-ftp-server-logon-exit-program-in-cl-code
コードが表示されているエリア右上にあるコピー・アイコンのボタンをクリックすることでコードがコピーできます。そして、そのまま貼り付けることで簡単にサンプルコードが取り込めます。
また、下図のように、RDiやVS Code(Code for i)を使うと、速やかにコピー・アンド・ペーストできますので、より簡単だと思います。SEUでソースファイルにコピーする場合は、画面単位になってしまうので少々手間がかかります。
サンプルCLPの解説
サンプルプログラムの大半は変数の宣言などで、主なロジック部分は下記の箇所です。
- このサンプルではユーザーIDが ANONYMOUS + 末尾1桁は任意文字のユーザー(例 ANONYMOUSA,ANONYMOUSB,,)がログインした場合、PUBLICライブラリーを現行ライブラリーにセットします。
- それ以外のユーザーについては、特に変更はせずにログインさせています。
- このサンプルを、CLP か CLLEとしてコンパイルすればOKです。
※注記
筆者の環境ではマニュアルのサンプルからコピー・アンド・ペーストした際、上記の5200行目でコンパイル・エラーになってしまいました。正しくは下記のように5200行目と5201行目が1行でコピー・アンド・ペーストされるはずですが、何らかの不具合で2行に分割されてコピーされたようです。同様なエラーが出る方は下記を参考に修正してください。
今回のFTPログイン時の出口プログラムは GOMALLIB/EXTPGM_FTP という名前でコンパイルしています。
ステップ② 出口点 QIBM_QTMF_SVR_LOGO
WRKREGINFコマンドを実行し、出口点 QIBM_QTMF_SVR_LOGONを探します。(図4)
QIBM_QTMF_SVR_LOGON 出口点には複数の出口点形式があります。出口点形式は、ログイン時に処理する内容に応じて異なります。
今回は、単純にログインユーザーIDの判断だけなので、出口点形式TCPL0100を使用します。この出口点形式のOPT.欄に8を入力しエンターキーを押します。
続けて表示される 出口プログラムの処理画面 のOPT.欄に「1」を入力してエンターキーを押すと、以下の図5の画面が表示されます。
以下を入力してエンターキーを押します。
- プログラム番号:任意の番号を入力。例では「1」を入力
- プログラム:ここまでで作成した出口プログラムの名前。例では「EXTPGM_FTP」
- ライブラリー:登録する出口プログラムのライブラリー。例では「GOMALIB」
下記のように、出口プログラムが登録されました。
以上で、「ステップ② 出口点 QIBM_QTMF_SVR_LOGO」における出口プログラムの登録が完了します。
手順③ FTPサーバーログイン後の妥当性検査用出口プログラムの作成手順
ステップ③ 出口点 QIBM_QTMF_SERVER_REQ
「手順② FTPサーバーログイン時の出口プログラムの作成」と同様の流れで、ログイン後の動作を制御する出口点 QIBM_QTMF_SERVER_REQに登録する出口プログラムも作成します。
こちらもサンプルが提供されています。
例: CL コードで作成された FTP サーバー・ログオン出口プログラム
https://www.ibm.com/docs/ja/i/7.5?topic=fslep-example-ftp-server-logon-exit-program-in-cl-code
例: ILE RPG コードで作成された FTP サーバー要求妥当性検査用出口プログラム
https://www.ibm.com/docs/ja/i/7.5?topic=rvepcs-example-ftp-server-request-validation-exit-program-in-ile-rpg-code
「手順② FTPサーバーログイン時の出口プログラムの作成」と同様に、サンプルを自分の環境の任意のソースファイルにコピー・アンド・ペーストします。RDiやVS Code(Code for i)で作業いただくと便利だと思います。
- CLのサンプルで上記の箇所では、ユーザーANONYMOUSの場合、PUBLICライブラリーに作業ライブラリを固定しています。
- 説明を省略しますが、クライアントからアクセスされたIPアドレスによって接続を制限するロジックも、サンプルCLP内に記述されています。
この資料では、上記のサンプルを GOMALIB/VLDPGM_FTP という名前でコンパイルしています。コンパイルが通ったら、出口点③QIBM_QTMF_SERVER_REQに登録します。
「手順② FTPサーバーログイン時の出口プログラムの作成」と同様に、出口プログラムが登録されたことを確認したら完了です。
ステップ④ アクセスするライブラリー、ファイル等への適切な権限付与
特にANONYMOUSユーザーの場合は、不必要なアクセス権限を付与しないようにします。
一例として、ANONYMOUSユーザーはライブラリーPUBLIC のSAVF をダウンロードさせるだけにしたい場合は、
- ライブラリー PUBLIC : ANONYMOUSユーザーの権限を*USE
- SAVF : ANONYMOUSユーザーの権限を*USE
とすればよいと思われます。
例:EDTOBJAUT OBJ(PUBLIC) OBJTYPE(*LIB) コマンド実行し、ANONYMOUSユーザーまたは*PUBLICの権限を*USEに設定
下の画面では、ANONYMOUSユーザーを、*USEに設定
EDTOBJAUT OBJ(PUBLIC/SAVFオブジェクト名) OBJTYPE(*FILE) コマンドを実行し、ANONYMOUSユーザー、または*PUBLICの権限を*USEに設定
実行時のサンプル
以上の設定を行った際の、実行例をご紹介します。
(1)出口プログラムを、2つとも登録していない状態
説明した出口点2つに出口プログラムを登録していない場合、ユーザーANONYMOUSはFTPサーバーにログインできずエラーとなります。
下記の例では、 530 Log on attempt by user ANONYMOUS rejected. のエラーが返されます。
(2)出口プログラムを2つとも登録した状態
ANONYMOUSユーザーでログインすると、
- 現行ライブラリーの変更が出来ません ・・・ ①
- ファイルのPUT(アップロード)が出来ません ・・・ ②
- PUBLICライブラリー中の*USE以上のアクセス権のあるファイルはダウンロード可能です ・・・ ③
参考情報
- 匿名ファイル転送プロトコルの構成:https://www.ibm.com/docs/ja/i/7.5?topic=i-configuring-anonymous-ftp
- 匿名ファイル転送プロトコル用の出口プログラムの作成:https://www.ibm.com/docs/ja/i/7.5?topic=ftp-writing-exit-programs-anonymous
- 例: CL コードで作成された FTP サーバー・ログオン出口プログラム:https://www.ibm.com/docs/ja/i/7.5?topic=fslep-example-ftp-server-logon-exit-program-in-cl-code