特定のポートを予約するほかに、PORT ステートメントを使用して、予約されていないユーザー指定のポートへのアプリケーション・アクセスを制御することもできます。アクセス制御が適用されるのは、アプリケーションが明示的バインド (explicit bind) または TCP listen を発行する場合です。
ジョブ名または SAF リソース、あるいはその両方の組み合わせを使用して、ユーザー指定の予約されていないポートへのアクセスを制御することができます。あるいは無条件でユーザー指定の予約されていないポートへのアクセスを否認することができます。これは、ポート番号がキーワード UNRSV で置換される 1 つ以上の PORT ステートメントを構成することにより実行できます。
PORT UNRSV アクセス制御を使用したい場合は、以下の考慮事項を参照してください。
ジョブ名のみを使用して、予約されていないポートのアクセスを制御するには、特定のジョブ名または部分ワイルドカード・ジョブ名 (1-7 文字で、後に * が付く) を指定した JOBNAME キーワードを使用して、1 つ以上の PORT UNRSV ステートメントを構成します。ワイルドカード・ジョブ名 (*) を指定すると、PORT UNRSV ステートメントはすべてのジョブ名に適用されます。アプリケーションのジョブ名が複数の PORT UNRSV ステートメントに一致する場合は、指定されているジョブ名との一致が最も近いステートメントを使用して、予約されていないポートへのアクセスを制御します。
ジョブ名の代わりに SAF リソースを使用して、予約されていないポートのアクセスを制御するには、ワイルドカード・ジョブ名 (*) と、SAF キーワードおよびリソース名を指定して PORT UNRSV ステートメントを構成します。ワイルドカード・ジョブ名を指定した PORT UNRSV ステートメントはプロトコル 1 つにつき 1 つしか使用できないので、この方法では 1 つのプロトコルにつき 1 つの SAF リソースの使用のみが許可されます。
ジョブ名と SAF リソースの組み合わせを使用してアクセスを制御するには、異なるジョブ名を使用して SAF キーワードとリソース名を 1 つ以上の PORT UNRSV ステートメントに指定します。これらの各 PORT UNRSV ステートメントに異なる SAF リソースを指定することができます。
プロトコルに対して PORT UNRSV ステートメントを何も構成しないと、すべてのアプリケーションが、予約されていないポートの使用を許可されます。これがデフォルトの動作です。この動作を変更し、ユーザー指定の予約されていないポートへのアクセスを無条件で否認するには、ワイルドカード・ジョブ名 (*) とキーワード DENY を指定して PORT UNRSV ステートメントを構成します。
UDP プロトコルの場合、アクセスは常に明示的バインドの発行時に制御されます (WHENBIND)。UDP アプリケーションの場合は、クライアントの役割とサーバーの役割の間には何の違いもありません。その理由は、アプリケーションが UDP サーバーであることを示す明示的ソケット API がないためです。予約されていない特定のローカル・ポートにソケットをバインドする UDP アプリケーションはすべて、構成済みのすべての UDP ポート・アクセス制御検査に合格する必要があります。
TCP プロトコルの場合は、明示的バインドが発行されたとき (WHENBIND)、またはそのポートで listen が発行されたとき (WHENLISTEN) に、ユーザー指定の、予約されていないポートへのアクセスを制御することができます。WHENLISTEN アクセス制御は、サーバーとして機能する TCP アプリケーション (すなわち、着信クライアント TCP 接続を受信できるアプリケーション) を対象としており、TCP のデフォルトです。デフォルトが使用されたり WHENLISTEN が指定され、予約されていないポートに対して listen が発行されないと、アクセス制御検査は行われません。WHENBIND アクセス制御は、アウトバウンド TCP 接続のために特定のローカル・ポートにバインドする TCP クライアント・アプリケーションに影響を与えることがあります。TCP プロトコル用のすべての PORT UNRSV ステートメントは、同じアクセス制御を指定している必要があります。 あるステートメントには WHENLISTEN を指定し、別のステートメントには WHENBIND を指定するということはできません。 そのようなことをした場合は、矛盾するステートメントが失敗します。
PORT UNRSV アクセス制御を使用すると、予期しない結果になることがあります。次の段階でのこの機能の実装について検討してください。
例えば、SERVAUTH プロファイルに UACC(READ) があり、成功の監査が有効になっている場合は、'PORT UNRSV TCP* SAF xyz WHENBIND' で開始することができます。 これにより、予約されていないポートに現在バインドされているアプリケーション数が示されます。報告されたアプリケーションを確認し、有効であると判断したら、PORT または PORTRANGE ステートメントを使用してそれらのポートを予約します。
失敗が確認されたら、適切な PORT 予約ステートメントを構成してそれらのポートへの許可アプリケーション・アクセスを許可します。
1 つのプロトコルに対して 1 つ以上の PORT UNRSV ステートメントを構成すると、予約されていないポートに明示的にバインドしており、構成されているどの PORT UNRSV ステートメントのプロトコルおよびジョブ名とも一致しないすべてのアプリケーションへのアクセスが無条件で否認されます。予約されていないポートに明示的にバインドしており、PORT UNRSV ステートメントのプロトコルおよびジョブ名と一致しないアプリケーションは、SAF または DENY キーワードによって制限されていない限り、予約されていないポートへのアクセスを許可されます。SAF キーワードが指定されている場合は、そのポートにアクセスしようとするアプリケーションと関連付けられたユーザー ID は、指定された SAF リソースへのアクセスを許可されている必要があります。DENY キーワードが指定されている場合は、アクセスは無条件に拒否されます。
あるいは、RDEFINE ステートメントの WHEN(PROGRAM) タイプを使用して、特定のプログラムを特定のポートに許可することができます (実行されるアドレス・スペースには関係なく許可)。ただし、この場合は、これらのプログラムがプログラム制御リソースでなければなりません。
プロトコルに対して PORT UNRSV ステートメントを構成しないと、そのプロトコルを使用した、予約されていないポートへのアクセスは制御されません。プロトコルに対して PORT UNRSV ステートメントを構成すると、アクセスはアプリケーションのジョブ名との一致が最も近いジョブ名を指定した PORT UNRSV ステートメントによって判別されます。アプリケーションのジョブ名がどの PORT UNRSV ステートメントのジョブ名とも一致しない場合は、そのプロトコルについては、予約されていないポートへのアクセスが否認されます。