セッション・セキュリティー

IBM® Storage Protect セッション・ベース・システムには、アプリケーションがセキュアな方法でセッションを開始できるようにするセキュリティー・コンポーネントがあります。 これらのセキュリティー基準は、サーバーに対する無許可アクセスを禁止し、システム保全性の保証に役立ちます。

サーバーで開始されるすべてのセッションは、サインオン・プロ セスを完了する必要があり、これにはパスワードが必要です。 クライアントの ノード名と結合されたパスワードは、サーバーへの接続時に適切な許可を もっていることを保証します。 アプリ ケーション・クライアントは、セッションを開始するために API にこの パスワードを提供します。

パスワード処理の方式には passwordaccess=promptpasswordaccess=generate の 2 つがあります。 passwordaccess=prompt オプションを使用する場合、 各 dsmInitEx 呼び出しにパスワード値を含める必要があります。 あるいは、 dsmInitEx 呼び出しでノード名と所有者名を指定することもできます。

パスワードには、それぞれに有効期限が付けられています。 dsmInitEx 呼び出しがパスワード有効期限切れの戻りコード (DSM_RC_REJECT_VERIFIER_EXPIRED) で失敗した場合、アプリケーション・クライアントは、 dsmInitExによって返されるハンドルを使用して dsmChangePW 呼び出しに入る必要があります。 これ によって、パスワードが更新されるので、セッションを正常に確立することができます。 図 3 の例は、 dsmChangePWを使用してパスワードを変更する手順を示しています。 ログイン所有者は、パスワードを変更する際に root ユーザー ID または許可ユーザー ID を使用する必要があります。

2 番目の方式の passwordaccess=generate は、パスワードの値を暗号化してファイルに保管します。 ノード名と所有者名を dsmInitEx 呼び出しで指定することはできず、システム・デフォルト値が使用されます。 これによって、パスワード・ファイル のセキュリティーが保たれます。 パスワードが失効すると、generate パラ メーターによって新規のパスワードが作成され、パスワード・ファイルが 自動的に更新されます。

ヒント:
  1. 2 つの異なる物理マシンが同じ IBM Storage Protect ノード名を持っている場合、または複数のサーバー・スタンザを使用して 1 つのノードに複数のパスが定義されている場合、 passwordaccess=generate は、パスワードの有効期限が切れた後に最初に使用されるスタンザに対してのみ機能する可能性があります。 最初のクライアント/サーバー接続時に、各サーバー・スタンザに関して別々に同じパスワードのプロンプトが表示され、各スタンザに対してパスワードのコピーが別々に保管されます。 パスワードの有効期限が切れると、最初にクライアント/サーバー接続を行うスタンザに対して新規パスワードが生成されます。 その後のほかのサーバー・スタンザを介しての接続の試みはすべて失敗します。それは 、古いパスワードのそれぞれのコピーと、パスワード期限切れ後に最初に使用され たスタンザによって生成された更新済みコピーとの間に、論理リンクが 存在しないからです。 この場合、有効期限前、またはこの状況からのリカバリーとして期限後に、パスワードを更新する必要があります。これは、次の手順で行います。
    1. dsmadmc を実行して、サーバー上のパスワードを更新します。
    2. dsmc -servername=stanza1 を実行し、新規パスワードを使用して適切なエントリーを生成します。
    3. dsmc -servername=stanza2 を実行し、新規パスワードを使用して適切なエントリーを生成します。
  2. UNIX または Linux®の場合: passwordaccess=promptの使用時にパスワードを変更できるのは、root ユーザーまたは許可ユーザーのみです。 passwordaccess=generate を使用すると、root ユーザーまたは許可ユーザーだけがパスワード・ファイルを開始できるようになります。
    制約事項: オプション users および groups は認識されません。

アプリケーションは、アクセス・フィルターを設定するなどの他の方法によって ユーザーによるアクセスを制限できます。

単一の IBM Storage Protect サーバーに対して複数の IP 接続を使用するアプリケーションでは、セッションごとに同じノード名と IBM Storage Protect クライアント・パスワードを使用する必要があります。 これを実現するには、次のステップに従います。

  1. 1 つの IBM Storage Protect サーバー・スタンザを dsm.sys ファイルに定義します。
  2. デフォルト IP アドレスを使用しない接続の場合は、 dsmInitEx 呼び出しで TCP サーバー アドレスと ポート (TCPport) のオプション値を指定します。

上記の値は、IP 接続の設定情報を上書きします。ただし、dsm.sys 内のスタンザと同じノード情報とパスワード情報が引き続きセッションで使用されます。

注: クラスター内のノードは単一のパスワードを共有します。
図1: セッションの開始と終了の例
dsmApiVersionEx * apiApplVer;
char           *node;
char           *owner;
char           *pw;
char           *confFile = NULL;
char           *options = NULL;
dsInt16_t      rc = 0;
dsUint32_t     dsmHandle;
dsmInitExIn_t  initIn;
dsmInitExOut_t initOut;
char           *userName;
char           *userNamePswd;
 
memset(&initIn, 0x00, sizeof(dsmInitExIn_t));
memset(&initOut, 0x00, sizeof(dsmInitExOut_t));
memset(&apiApplVer,0x00,sizeof(dsmapiVersionEx));
apiApplVer.version = DSM_API_VERSION; /* Set the applications compile */
apiApplVer.release = DSM_API_RELEASE;  /* time version.         */
apiApplVer.level   = DSM_API_LEVEL;
apiApplVer.subLevel= DSM_API_SUBLEVEL;
 
printf("Doing signon for node %s, owner %s, with password %s\n", node,owner,pw);
 
initIn.stVersion = dsmInitExInVersion;
initIn.dsmApiVersionP = &apiApplVer
initIn.clientNodeNameP = node;
initIn.clientOwnerNameP = owner ;
initIn.clientPasswordP = pw;
initIn.applicationTypeP = "Sample-API AIX";
initIn.configfile = confFile;
initIn.options = options;
initIn.userNameP = userName;   
initIn.userPasswordP = userNamePswd;
rc = dsmInitEx(&dsmHandle, &initIn, &initOut);
 
if (rc == DSM_RC_REJECT_VERIFIER_EXPIRED)
{
   printf("*** Password expired. Select Change Password.\n");
   return(rc);
}
else if (rc)
{
   printf("*** Init failed: ");
   rcApiOut(dsmHandle, rc);   /* Call function to print error message */
   dsmTerminate(dsmHandle);    /* clean up memory blocks */
   return(rc);
}
図2: rcApiOut の詳細
void rcApiOut (dsUint32_t handle, dsInt16_t rc)
{
     char *msgBuf ;
 
     if ((msgBuf = (char *)malloc(DSM_MAX_RC_MSG_LENGTH+1)) == NULL)
     {
          printf("Abort:  Not enough memory.\n") ;
          exit(1) ;
      }
 
      dsmRCMsg(handle, rc, msgBuf);
      printf("
      free(msgBuf) ;
      return;
}
図3: パスワードの変更の例
printf("Enter your current password:");
gets(current_pw);
printf("Enter your new password:");
gets(new_pw1);
printf("Enter your new password again:");
gets(new_pw2);
/* If new password entries don't match, try again or exit. */
/* If they do match, call dsmChangePW.                          */
 
rc = dsmChangePW(dsmHandle,current_pw,new_pw1);
if (rc)
{
   printf("*** Password change failed.  Rc = 
}
else
{
   printf("*** Your new password has been accepted and updated.\n");
}
return 0;