본 장에서는 Tmax에서 지원하는 보안 시스템에 대해서 설명한다.
Tmax는 시스템 접속 제어, 사용자 인증, 서비스 접근 제어의 3단계로 보안 기능을 제공하고 있다.
단계별 보안 기능은 Tmax 환경 파일의 DOMAIN 절의 SECURITY 항목을 통해 설정한다. SECURITY 항목의 설정값에 따라 다음과 같이 보안이 설정된다.
설정값 | 설명 |
---|---|
DOMAIN_SEC | 시스템 접속 제어 |
USER_AUTH | 사용자 인증 |
ACL | MANDATORY | 서비스 접근 제어 |
NO_SECURITY | 보안 기능이 적용하지 않음 |
각 파일(그룹, 사용자, acl)에 대한 생성 방법 및 명령어에 대한 내용은 "Tmax Reference Guide"를 참고한다.
1단계 보안은 시스템 접속 보안으로 사용자 클라이언트가 가장 처음 Tmax 시스템에 연결할 때 이를 제한한다. Tmax 시스템에 대한 단일 암호를 설정하는 것으로, 실질적으로 DOMAIN 절의 OWNER 항목에 정의된 계정에 대한 암호가 된다.
Tmax 시스템 설정 전에 암호는 mkpw 유틸리티로 설정되어야 한다. 이 보안이 설정되면, 클라이언트는 tpstart() 함수를 호출하는 경우 TPSTART_T 구조체의 dompwd 항목에 해당 암호를 등록한다. 암호가 맞는 경우에만 클라이언트는 Tmax 시스템 접속에 성공한다. 설정값이 'NO_SECURITY' 인 경우는 dompwd 항목에 값을 설정할 필요가 없으며, NULL 값이 전달된다.
다음은 1단계 보안을 사용하는 Tmax 환경 파일의 예제이다.
#시스템 인증인 경우 SECURITY항목에 "DOMAIN_SEC"라고 설정한다.
*DOMAIN
res1 SHMKEY = 66999, MAXUSER = 256,
SECURITY = "DOMAIN_SEC", OWNER = tmax
*NODE
Tmax TMAXDIR = "/home/tmax",
APPDIR = "/home/tmax/appbin"
*SVRGROUP
svg1 NODENAME = tmax
*SERVER
upper SVGNAME = svg1, RESTART = Y, MAXRSTART = 3
*SERVICE
TOUPPER SVRNAME = upper
TOLOWER SVRNAME = upper, PRIO = 100
다음은 TPSTART_T 구조체의 dompwd를 사용해서 암호를 설정하는 예이다.
... main(int argc, char *argv[]) { ... TPSTART_T *tpinfo; ... if ((tpinfo = (TPSTART_T *)tpalloc(“TPSTART”, NULL, sizeof(TPSTART_T)))== NULL){ error processing routine } strcpy(tpinfo->dompwd, “tmax1234”); if (tpstart(tpinfo) == -1){ error processing routine } ... }
2단계 보안은 사용자 인증 보안으로 Tmax 시스템에 인증된 사용자만이 Tmax 시스템 접속을 허락한다.
클라이언트는 tpstart() 함수 호출로 Tmax 시스템에 접속하려고 할 때, TPSTART_T 구조체의 usrname과 usrpwd 항목을 등록한다. usrname은 Tmax 시스템에 인증된 사용자 계정이며, usrpwd는 그에 대한 암호가 된다. 사용자 계정과 암호는 설정 전에 mkpw 유틸리티에 의해 설정되어야 한다. 이러한 사용자 인증 보안이 설정되었다면, usrname과 usrpwd가 Tmax 시스템에 인증된 것으로 확인되어야만 Tmax 시스템 접속에 성공한다.
사용자 인증 보안은 시스템 접속 제어 보안의 다음 단계로서 시스템 접속 제어 보안을 포함한다. 클라이언트는 dompwd 항목도 바르게 등록하여야 한다. dompwd도 역시 mkpw에 의해 설정되어야 한다.
암호 파일은 반드시 Tmax 시스템 설정 전에 생성되고 갱신되어야 한다.
다음은 2단계 보안을 사용하는 Tmax 환경 파일의 예제이다.
#사용자 인증인 경우 SECURITY항목에 "USER_AUTH"라고 설정한다.
*DOMAIN
res1 SHMKEY = 66999, MAXUSER = 256,
SECURITY = "USER_AUTH", OWNER = tmax
*NODE
tmax TMAXDIR = "/home/tmax",
APPDIR = "/home/tmax/appbin"
*SVRGROUP
svg1 NODENAME = tmax
*SERVER
upper SVGNAME = svg1, RESTART = Y, AXRSTART = 3
*SERVICE
TOUPPER SVRNAME = upper
TOLOWER SVRNAME = upper, PRIO = 100
다음은 TPSTART_T 구조체의 usrname, usrpwd를 사용해서 암호를 설정하는 예이다.
... main(int argc, char *argv[]) { ... TPSTART_T *tpinfo; if((tpinfo = (TPSTART_T *)tpalloc(“TPSTART”, NULL,sizeof(TPSTART_T))) == NULL){ error processing routine } strcpy(tpinfo->dompwd, “tmax1234”); strcpy(tpinfo->usrname, “gdhong”) ; strcpy(tpinfo->usrpwd, “hong0000”) ; if (tpstart(tpinfo) == -1){ error processing routine } ... }
3단계 보안은 서비스 접근 제어 기능으로, Tmax 시스템에 접속한 사용자들 중에서 서비스별로 사용자 접근을 제한할 수 있는 기능이다.
서비스 접근 권한 제어는 사용자 그룹별로 이루어진다. 하나의 서비스는 그 서비스에 대해 접근 권한이 허용된 그룹에 해당되는 사용자만이 접근이 가능하다. 따라서 이 기능을 사용하기 위해서는 그룹 파일을 만들어 주어야 하며, 해당 그룹에 속하는 사용자 파일이 있어야 한다. 그리고 서비스별 접근 가능한 사용자 그룹을 지정해주는 acl이라고 불리는 파일도 있어야 한다. 해당 기능을 사용하기 위해서는 DOMAIN 절의 SECURITY 항목에 ACL 또는 MANDATORY 값을 설정해야 한다.
3단계 보안 기능은 1단계 시스템 접속 제어, 2단계 사용자 인증 기능까지 모두 포함하고 있다. 따라서 SECURITY 항목이 ACL(또는 MANDATORY)로 설정되어 있는 경우 TPSTART_T 구조체에 dompwd, usrname, usrpwd 필드를 사용하여 1, 2단계 인증을 거쳐 Tmax 시스템에 접속 성공한 경우에만 서비스 접근 권한이 가능해진다.
다음은 3단계 보안을 사용하는 Tmax 환경 파일의 예제이다.
*DOMAIN
tmax1 SHMKEY = 78350,
TPORTNO = 8350, SECURITY = ACL, OWNER = starbj0, RACPORT = 3155
*NODE
tmaxh4 TMAXDIR = "/EMC01/starbj81/tmax",
APPDIR = "/EMC01/starbj81/tmax/appbin"
tmaxh2 TMAXDIR = "/data1/starbj81/tmax",
APPDIR = "/data1/starbj81/tmax/appbin",
*SVRGROUP
svg1 NODENAME = "tmaxh4", COUSIN = "svg2", LOAD = 1
svg2 NODENAME = "tmaxh2", LOAD = 5
svg3 NODENAME = "tmaxh4"
*SERVER
svr01001 SVGNAME = svg1
svr_ucs1 SVGNAME = svg3, CLOPT = "-u 35", SVRTYPE = UCS, MIN = 1, MAX = 2
svr_ucs2 SVGNAME = svg3, CLOPT = "-u 37", SVRTYPE = UCS, MIN = 1, MAX = 2
*SERVICE
TOUPPER1 SVRNAME = svr01001
TOUPPER2 SVRNAME = svr01001
LOGIN1 SVRNAME = svr_ucs1
LOGIN2 SVRNAME = svr_ucs2
<그룹 파일>
grp0:x:1001 grp1:x:1 grp2:x:2 grp3:x:3 grp4:x:4 grp5:x:5
<사용자 파일>
starbj0:1002:1 starbj1:1:1 starbj2:2:2 starbj3:3:3 starbj4:4:4 starbj5:5:5
<acl 파일>
TOUPPER1:SERVICE:1 TOUPPER3:SERVICE:5 TOUPPER5:SERVICE:5
<클라이언트 프로그램>
int main() { ... strcpy(tpinfo->usrname, "starbj1"); strcpy(tpinfo->dompwd, "starbj0"); strcpy(tpinfo->usrpwd, "starbj1"); ... if(tpcall("TOUPPER1", sndbuf, 0, &rcvbuf, &rcvlen, 0)==-1){ error routine.. }