세션 보안
IBM® Storage Protect 세션 기반 시스템에는 애플리케이션이 보안 방식으로 세션을 시작할 수 있도록 허용하는 보안 구성요소가 있습니다. 이러한 보안 조치는 서버에 대한 권한 없는 액세스를 금지하고 시스템 무결성을 보장합니다.
서버에 대해 시작되는 모든 세션은 로그온 프로세스를 완료해야 하며 비밀번호가 필요합니다. 비밀번호가 클라이언트의 노드 이름과 결합된 경우에는 서버에 연결 시 적절한 권한이 보장됩니다. 애플리케이션 클라이언트는 이 비밀번호를 API에 제공하여 세션을 시작합니다.
두 가지 비밀번호 처리 방법(passwordaccess=prompt 또는 passwordaccess=generate)을 사용할 수 있습니다. passwordaccess=prompt 옵션을 사용하는 경우에는 각 dsmInitEx 호출에 비밀번호 값을 포함해야 합니다. 또는 dsmInitEx 호출에서 노드 이름 및 소유자 이름을 제공할 수 있습니다.
비밀번호에는 연관된 만료 시간이 있습니다. dsmInitEx 호출이 비밀번호 만료 리턴 코드 (DSM_RC_REJECT_VERIFIER_EXPIRED) 로 실패하는 경우, 애플리케이션 클라이언트는 dsmInitEx에서 리턴한 핸들을 사용하여 dsmChangePW 호출을 입력해야 합니다. 이를 수행하면 세션이 확립되기 전에 비밀번호가 업데이트됩니다. 그림 3 의 예제는 dsmChangePW를 사용하여 비밀번호를 변경하는 프로시저를 보여줍니다. 로그인 소유자는 루트 사용자 ID 또는 권한 부여된 사용자 ID를 사용하여 비밀번호를 변경해야 합니다.
두 번째 방법(passwordaccess=generate)에서는 비밀번호 값을 암호화하여 파일에 저장합니다. 노드 이름 및 소유자 이름은 dsmInitEx 호출에 제공할 수 없으며 시스템 기본값이 사용됩니다. 이를 통해 비밀번호 파일의 보안이 보호됩니다. 비밀번호가 만료되면 generate 매개변수가 새 비밀번호를 작성하고 비밀번호 파일을 자동으로 업데이트합니다.
- 두 개의 서로 다른 실제 시스템에 동일한 IBM Storage Protect 노드 이름이 있거나 여러 서버 스탠자를 사용하여 한 노드에 여러 경로가 정의된 경우, passwordaccess=generate 는 비밀번호 만료 후 처음 사용되는 스탠자에 대해서만 작동할 수 있습니다. 첫 번째 클라이언트-서버 접속 중에 각 서버 스탠자에 개별적으로 동일한 비밀번호를
사용하도록 프롬프트되며 각 스탠자에 대해 비밀번호 사본이 개별적으로 저장됩니다. 비밀번호가 만료되면 첫 번째 클라이언트-서버 접속을 연결하는 스탠자에 대한 새
비밀번호가 생성됩니다. 이전 비밀번호의 해당 각 사본과 비밀번호 만료 후 처음으로 사용된 스탠자에 의해 생성된
업데이트된 사본 사이에 논리 링크가 없으므로 기타 서버 스탠자를 통한 후속 연결
시도는 모두 실패합니다. 이 경우에는 다음과 같이 상황에 대한 복구로서 만료 전 또는 후에 비밀번호를
업데이트해야 합니다.
- dsmadmc를 실행하고 서버에서 비밀번호를 업데이트하십시오.
- dsmc -servername=stanza1을 실행하고 새 비밀번호를 사용하여 적절한 항목을 생성하십시오.
- dsmc -servername=stanza2을 실행하고 새 비밀번호를 사용하여 적절한 항목을 생성하십시오.
- UNIX 또는 Linux®의 경우: passwordaccess=prompt를 사용하는 경우에는 root 사용자 또는 권한이 있는 사용자만 비밀번호를 변경할 수 있습니다. passwordaccess=generate를 사용하는 경우에는 root 사용자 또는 권한이 있는 사용자만 비밀번호 파일을 시작할 수 있습니다.제한사항: users 및 groups 옵션은 인식되지 않습니다.
애플리케이션은 다른 방법(예: 액세스 필터 설정)으로 사용자 액세스를 제한할 수 있습니다.
단일 IBM Storage Protect 서버에 대한 다중 IP 연결을 사용하는 애플리케이션은 각 세션에 대해 동일한 노드 이름 및 IBM Storage Protect 클라이언트 비밀번호를 사용해야 합니다. 다음 단계를 수행하여 이 지원을 사용 가능으로 설정하십시오.
- dsm.sys 파일에 하나의 IBM Storage Protect 서버 스탠자를 정의하십시오.
- 기본 IP 주소를 사용하지 않는 연결의 경우, dsmInitEx 호출에서 TCPserver 주소 및 TCPport 에 대한 옵션 값을 지정하십시오.
이러한 값은 IP 연결 정보를 겹쳐쓰지만 세션에서는 동일한 dsm.sys 스탠자 노드 및 비밀번호 정보를 계속 사용합니다.
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);
}
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;
}
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;