Title Overview of Role-Based Access Control
Objectives
RBAC 이해와 구성
Preperation
/etc/passwd,
/etc/shadow,
access control list
file permission
Description
이제껏 우리가 사용해온 전형적인 UNIX 보안체계는 superuser는 막강한 힘을 발휘하는 반면에 일반 사용자는 자신의 사소한 문제도 해결할 수 있는 힘조차 가질 수 없는 방식이었다.
솔라리스 운영체제는 RBAC(Roal-Based Access Control)라는 방식을 통하여 기존의 superuser 방식의 보안체계, 어느정도 융통성을 부여하는 길을 열어주었다. 필요할 경우 특정 사용자에게 새로운 역할를 부여함으로서 수퍼유저의 권한을 적절히 나누어줄 수 있도록 해주는 것이 RBAC의 특징이다.
RBAC에서는 특정 용어가 다음과 같이 사용된다.
권한위임 (authorization) : 사용자 권한으로는 접근할 수 없었던 작업을 수행할 수 있는 새로운 능력을 부여.
실행 profile (Execution profile) : 특정한 속성 (예. 사용자 및 그룹 ID)과 연관된 권한 및 명령어를 함께 명시한 메카니즘.
역할 (Role) : 관리자 작업중 일부를 수행할 수 있도록 고안된 특별한 형태의 사용자계정 (이것 역시 하나의 계정 형태임)
l RBAC 사용은 언제 하나?
만일 관리자가 일정기간 휴가나 출장을 떠날일이 발생하였다. 그동안 믿을만한 특정 사용자에게 자신의 권한중 일부를 일정기간 부여하고 싶을 때, 즉 그동안 시스템 관리부분의 일부를 대행시키고자 할 때에는 어떤 방법을 사용할 수 있을까 ? 기존의 보안체계에서는 자신의 계정과 암호를 잠시 알려주는 모험에 가까운 방법이 유일한 대안이었다. 아니면 잠시 시스템 관련 작업은 중지하고 있어야 한다.
그러나 RBAC를 활용할 경우, 필요한 일부 권한을 위임(authorization)하여 역할(role)로 만든후 그 역할만을 사용자에게 줄 수 있는 것이다. 이 경우, 사용자는 자연스럽게 일부의 권한을 위임받을 수 있다. 물론 위임받지 못한 역할에 대해서는 전혀 손쓸 수 없다..
RBAC는 특정한 권한을 사용자에게 부여할 때 다음 4가지 데이터베이스에 담긴 내용에 따라 작업을 수행한다.
* user_attr (사용자 속성 DB) : 사용자, role 및 이들에게 위임할 권한, 그리고 실행 profile을 명시.
* auth_attr (권한속성 DB) : 위임 권한 명칭 및 속성을 명시해놓았으며 그에 대한 도움말 파일을 지정.
* prof_attr (실행 profile속성 DB) : profile을 명시하고 profile이 지정된 권한을 나열해놓았으며 그에 대한 도움말 파일을 지정.
* exec_attr (profile 실행 속성 DB) : profile에 부여한, 특별한 권한을 가지고 있는 작업내용을 명시.
RBAC data base 의 역할
* user_attr 데이터베이스에서 사용자에게 권한과 실행profile을 지정해줄 수 있다. 이것은 권한을 사용자에게 직접 부여해주는 방식이다.
* 사용자에게 권한이 아닌 역할(role)을 부여할 수 있다. 이경우, 사용자는 그 역할에 관련된 특별권한을 수행할 수 있는 권한을 갖게 된다. (RBAC를 사용하는 진정한 목적이 바로 이것이다)
* 실행 profile은 prof_attr DB에 정의되어 있다. 실행 profile은 auth_attr에서 지정한 위임권한 및 exec_attr에서 해당 실행 프로파일에 대하여 지정한 속성과 관련한 명령어를 함께 포함하여 정의할 수 있다. (간단히 표현하면 위임권한과 명령어를 함께 묶어놓았다는 뜻이다)
실행 profile에 지정한 명령어는 profile shell이라고 불리우는 특정 쉘에서만 실행된다. 이 쉘은 pfsh, pfcsh, pfksh라는 이름이 붙어있다. 이들은 각각 Bourne shell (sh), C shell (csh), Korn shell (ksh)에 대응하는 shell로서 각 명칭앞에 pf를 붙였다고 생각하면 된다. (profile shell과 일반 shell은 동일한 것이 아님.)
/etc/user_attr DB는 /etc/passwd 파일과 /etc/shadow 파일을 보조해 주는 역할을 한다. 이곳에는 확장된 사용자 속성 (예. 권한 및 실행 profile등)이 들어있다. 또한 사용자에게 역할을 지정해줄 수 있다.
- 역할(role)이란 위에서 언급하였듯 관리자밖에 할 수 없는 작업 일부를 일반사용자도 수행할 수 있도록 고안된 특별한 형태의 사용자 계정이다.
역할(role)계정으로 로그인을 하면 사용자는 일반사용자의 계정을 가지고는 실행할 수 없었던 작업을 실행할 권한을 갖게된다.
이러한 권한을 갖게하는 role 계정으로 로그인을 하는 방법은 CDE 로그인과 같은 일반적인 login 과정으로 할 수는 없다. 뒤에서 다시 설명하겠지만 role계정으로 로그인을 하려면 su (switch user) 명령어를 이용하여야 한다.
user_attr DB 는 다음과 같이 콜론(:)으로 각 필드를 구분한다.
user:qualifier:res1:res2:attr
각 필드는 다음과 같은 의미를 갖는다.
- user : passwd DB에 명시된 사용자 이름.
- qualifier : 추후 사용을 위한 예비 필드
- res1 : 추후 사용을 위한 예비 필드
- es2 : 추후 사용을 위한 예비 필드
- attr : 사용자가 명령어를 수행할 때 적용할 보안 속성을 명시한 키 값이다. 여러 가지의 키를 명시할때 각 키는 세미콜론(;)으로 분리하여 표기한다. 사용할 수 있는 키는 아래와 같다.
* auths : auth_attr DB에 명시된 사용권한 중에서 선택한 권한명칭을 콤마( , )로 구분한 목록. 권한명칭은 와일드카드(*)도 사용할 수 있다. 예를 들어 solaris.device.* 라고 표기한 것은 모든 솔라리스 device에 대한 사용권한을 의미한다.
* profiles : prof_attr DB에 명시된 profile중 선택한 profile명칭으로서 서열순으로 표기하고 콤마( , )로 구분한 목록. Profile은 사용자가 실행할 수 있는 명령어와 해당 명령어의 속성을 결정한다. user_attr에 명시된 사용자중 극소수만이 모든 profile을 가질 수 있는 All로 설정해야 한다. (모든 profile을 갖게 되는 All로 설정한다는 것은 속성에 상관없이 모든 명령어를 사용할 수 있다는 뜻이다) profile의 서열 역시 매우 중요하다. 그것은 마치 유닉스의 탐색경로와 같은 원리로 사용된다. 수행될 명령어가 들어있는 목록의 첫째 profile은 어떠한 속성이 어떠한 명령어에 적용되는가를 명시한다.
* role : 사용자에게 새로이 부여할 역할이다. 콤마로 구분한 목록형태로 표시한다. 여기서 역할은 user_attr DB에 있는것과 동일해야 하며 이가운데 특정값을 지정하여 결정한다. role 계정에게는 role을 지정할 수 없다. 오직 사용자 계정에게만 지정할 수 있다. (계정은 일반사용자 계정과 role 계정이 있다)
* type : normal이나 role로 지정한다. 만일 일반사용자 계정이면 normal로,
role에 대한 계정이라면 role로 지정한다.
- 시스템에 설치된 user_attr DB를 살펴보면 아래와 같이 기본값이 지정되어 있을 것이다.
root::::type=normal;auths=solaris.*,solaris.grant;profiles=All
sysadmin::::type=role;profiles=Device Management, Filesystem Management,All
anne::::type=normal;auths=solaris.system.date;roles=sysadmin;profiles=All
위 예를 살펴보면 첫째줄에서는 root에 대하여 모든 권한을 부여한다. 둘째줄은 role 계정이다. sysadmin에 대한 역할을 정의하였다. 다음줄을 일반 사용자 계정이다. 여기서 anne이라는 사용자에게 sysadmin role을 지정하였다.
이렇게 sysadmin 역할을 지정해줌으로써 anne은 Device Management, Filesystem Management와 모든 profile에 대한 profile을 access할 수 있는 막강한 권한을 갖게 된다.
- RBAC 를 사용하려면
1.역할과 이에 대한 권한을 정의한다.
2.정의한 역할을 사용자에게 부여한다.
3.역할을 부여받은 사용자는 이에 대한 권한을 갖게 된다.
/etc/security/auth_attr :
사용자가 위임받은 권한을 사용코자 할 때 해당 프로그램은 auth_attr 데이터베이스를 검사하여 위임받은 권한이 있는가를 살펴본후 사용가능 여부를 결정한다. 예를 들어 사용자가 다른 사용자의 crontab 파일을 편집하고자 한다면 solaris.jobs.admin 이라는 권한이 auth_attr에 명시되어 있어야 한다.
사용자 혹은 role이 user_attr 데이터베이스에 명시되어 있으면, 사용자나 role에게 각 권한들을 직접 지정할 수 도 있다. 또한, 실행 profile에 위임할 권한을 지정한 후 이것을 다시 해당 사용자에게 넘겨줄 수 있다.
auth_attr 데이터베이스의 각 필드는 콜론으로 구분하여 아래와 같은 형식으로 나타낸다.
authname:res1:res2:short_desc:long_desc:attr
- authname : 위임받은 권한을 명시함. 단일 문자형 상수로 표현하며 접두사.접미사 형태로 구성한다. 명명법은 바로 아래에 설명해 놓았다.
- res1 : 추후 사용을 위한 예비 필드
- res2 : 추후 사용을 위한 예비 필드
- short_desc : 사용자 인터페이스를 표시하는데 적당한 권한에 대한 간략한 명칭.
-long_desc : 긴 표현. . 이 필드는 사용될 권한과 응용프로그램의 목적, 그리고 그것을 사용하고자 하는 사용자의 형태를 나타내주어야 한다. 응용프로그램의 도움말로 사용하기 적절하게 표현되어야 한다.
- attr : 권한의 속성을 보여주는 옵션 목록으로서 key 워드로 나타낸다. 여러개를 사용할 때에는 세미콜론 (;)으로 구분함.
키워드로서 help를 사용할때 이에 대한 해당 도움말은 html 형태의 도움말로 되어있다. 이 도움말 파일은 이미 /usr/lib/help/auths/locale/C 디렉토리안에 저장되어 있다.
해당되는 도움말 파일 이름만 help=xxxx.html, 이런 형식으로 적어주면 된다.
- authname 명명법 : 솔라리스 운영체제를 사용하는 권한은 solaris라는 접두사로 표현한다. 그외 다른 권한은 그 권한을 만들어낸 기관의 인터넷 도메인 이름 순서를 역으로 배열한 접두사를 사용한다. (예 : corp.com의 경우에는 com.corp)
접미사는 권한을 행사할 수 있는 부분 (예. device) 및 작업 명칭 (예. config, allocate, grant, revoke등) 으로 표현한다.
만일 접미사가 붙지 않고 씌여져 있다면 authname은 권한에 우선하여 GUI 환경에서 해당 응용프로그램을 실행시키던 명칭으로 작동하게 된다. authname solaris.printmgr. 은 이렇게 GUI환경 하에서의 명칭을 사용한 예이다.
authname이 grant라는 단어로 끝났다면, authname은 그 권한을 grant, 즉 양도해준다. 즉, 사용자의 해당 권한(동일한 접두사 및 기능에 관한 권한)을 다른 사용자에게 양도해주는 것이다.
예로, authname solaris.printmgr.grant라고 표기되었다면 이는 사용자에게 solaris.printmgr.admin 권한과 solaris.printmgr.nobanner 권한을 다른 사용자에게 양도할 수 있는 권한을 부여한 다는 뜻이다.
솔라리스 8을 사용하는 여러분의 /etc/security 디렉토리 안에는 auth_attr이라는 파일이 들어있다. 이파일의 내용을 보면 솔라리스 운영에 대한 모든 권한 목록을 망라하고 있음을 발견할 것이다. 불필요한 권한 앞에 주석표시(#)를 하면, 여러분이 필요한 권한만 선택하여 사용할 수 있다.
또한 /usr/lib/help/auths/locale/C 디렉토리의 index.html 파일에도 authname으로 사용할 수 있는 솔라리스 운영에 대한 권한 (authorization) 목록 및 그에 대한 설명을 담은 도움말이 있다.
auth_attr 데이터베이스 예제 (시스템에 기본적으로 지정이 되어 있음)
solaris.*:::Primary Administrator::help=PriAdmin.html
solaris..grant:::Grant All Rights::help=PriAdmin.html
....
solaris.device.:::Device Allocation::help=DevAllocHeader.html
solaris.device.allocate:::Allocate Device::help=DevAllocate.html
solaris.device.conf::::Configure Device Attributes::help=DevConfig.html
solaris.device.revoke:::Revoke or Reclamim Device::help=DevRevoke.html
....
solaris.sys:::Machine Administration::help=SysHeader.html
solaris.system.date:::Set Date and Time::help=SysDate.html
solaris.system.shutdown::: Shutdown the System::help=SysShutdown.html
auth_attr과 user_attr의 관계.
auth_attr DB
solaris.*:::Primary Administrator::help=PriAdmin.html
...
solaris.system.date:::Set Date & Time::help=SysDate.html
auth_attr 데이터베이스에 명시된 solaris.system.date 권한은 시스템의 날짜와 시각을 조정할 수 있는 권한이다. 이 권한이 'auths=solaris.system.date' 라는 문구 한줄로서 아래 예제의 user_attr 데이터베이스에 있는 sunny라는 사용자에게 지정되는 것이다.
user_attr DB
root::::type=normal;auths=solaris.*,solaris.grant;profiles=All
...
user01::::type=normal;auths=solaris.system.date;roles=sysadmin;profiles=All
....
user01 라는 사용자가 solaris.system.dat 권한 및 sysadmin이라는 역할을 위임받았다.
실행 profile은 권한과 명령어를 특별한 속성과 함께 묶어놓은 메카니즘이다. 여기에서 지정한 실행 profile들은 사용자나 role에게 지정할 수 있다. 특별한 속성이란real 및 effective UID, GID를 지칭한다. 가장 일반적인 속성은 real UID 및 effective UID가 root로 지정된 형태이다. 실행 profile의 정의는 etc/security/prof_attr 데이터베이스에 저장되어 있다.
(실행 파일이 수행되면서 프로세스가 만들어질 때, 프로세스를 생성시킨 사용자의 UID를 real UID라 하고, 생성된 프로세스가 가지는 UID를 effective UID라 한다. 일반적으로는 real UID와 effective UID는 같다. 그리고 프로세스는 effective UID의 권한으로 수행된다)
prof_attr 데이터베이스 역시 콜론으로 각 필드가 구분된다.
profname:res1:res2:desc:attr
- profname : profile의 명칭
- res1 : 추후 사용을 위한 예비 필드
- res2 : 추후 사용을 위한 예비 필드
- desc : 긴 표현. 이 필드는 프로파일의 목적 및 그것을 사용하고자 하는 사용자의 형태를 나타내 주어야 한다. 응용프로그램의 도움말로 사용하기 적절하게 표현되어야 한다.
- attr : 실행할 대상에 적용할 보안 속성을 보여주는 옵션 목록으로서 key 워드로 나타낸다. 여러개를 사용할 때에는 세미콜론 (;)으로 구분함. 유효한 키워드로는 help, auth 가 있다.
- help 키워드를 사용할 때 이에 대한 해당 도움말은 html 형태의 도움말로 되어있다. 이 도움말 파일은 이미 /usr/lib/help/auths/locale/C 디렉토리안에 저장되어 있다. 해당되는 도움말 파일 이름만 help=xxxx.html, 이런 형식으로 적어주면 된다.
- auth : auth_attr 데이터베이스에 명시된 위임권한 명칭중에서 선택. 여러개를 사용할 때에는 컴마(,)로 구분함. 위임권한 명칭은 와일드카드 (*)를 사용하여 나타낼 수 있음.
시스템에 설정된 prof_attr DB의 예
All:::Standard Solaris user:help=All.html
Audit Control:::Administer the audit
subsystem:auths=solaris.audit.config,solaris.jobs.admin;help=AuditControl.html
Audit Review:::View the audit trail:auths=solaris.audit.read;help=AuditReview.html
Device Management:::Control Access to Removable
Removable Media:auths=solaris.device.*;help=DevMgmt.html
Printer Management:::Control Access to Printer:help=PrinterMgmt.html
prof_attr과 user_attr의 관계
Profile Attributes Database
All:::Standard Solaris user:help=All.html
...
Device Management:::Control Access to Removable Media:
auths=solaris.device.*;help=DevMgmt.html
..
Device Management라는 실행 프로파일의 권한과 명령어를 정의함
User Attributes Database 예제
root:::type=normal;auths=solaris.*,solaris.grant;profiles=All
sysadmin:::type=role;profiles=Device Management
sysadmin이라는 role계정을 만들어서 Device Management 권한을 부여하였다. 이후, prof_attr에서 정의한 Device Management profile이 user_attr에서 정의한 sysadmin role에게 지정되었다.
prof_attr과 auth_attr의 관계
Profile Attributes Database
All:::Standard Solaris user:help=All.html
...
Device Management:::Control Access to Removable Media:
auths=solaris.device.*;help=DevMgmt.html
...
위에서 보면 Device Management profile은 solaris.device. 라는 문자열 상수로 시작되는 모든 권한을 갖는 것으로 prof_attr에서 정의된다. 이러한 권한들은 아래 auth_attr에서 정의된 것이다.
auth_attr Database 예제
solaris.*:::Primary Administrator::help=PriAdmin.html
solaris..grant:::Grant All Rights::help=PriAdmin.html
....
solaris.device.:::Device Allocation::help=DevAllocHeader.html
solaris.device.allocate:::Allocate Device::help=DevAllocate.html
solaris.device.config::::Configure Device Attributes::help=DevConfig.html
solaris.device.revoke:::Revoke or Reclaim Device::help=DevRevoke.html
실행속성은 profile이 지정된 해당 사용자나 role에 의하여 수행되는 명령어로서 특별한 보안속성을 가진다. 여기서 특별한 보안속성은 UID, EUID, GID, EGID와 같은 속성으로서 명령어가 실행될 때 해당 프로세스에 추가된다.
실행속성이 명시된 내용은 /etc/security/exec_attr 데이터베이스에 저장된다.
exec_attr 데이터베이스 필드
name:policy:type:res1:res2:id:attr
.
- name : profile의 명칭
- policy : 해당 엔트리에 관련된 보안정책, 현재로는 suser (수퍼유저 정책 모델)만이 유효한 값이다.
- type : 속성이 명시된 엔티티 형태. 현재로는 cmd (command)만이 유효한 값이다.
- res1 : 추후 사용을 위한 예비 필드
- res2 : 추후 사용을 위한 예비 필드
- id : 엔티티를 규정한 문자열 상수. 와일드카드 (*)를 사용하여 나타낼 수 있음. 명령어들은 전체 경로 혹은 와일드카드 (*)를 포함하는 경로를 가져야 한다.
- attr : 실행할 엔티티에 적용할 보안 속성을 표현한 옵션 목록으로서 key 워드로 나타낸다. 여러개를 사용할 때에는 세미콜론 (;)으로 구분함. 사용할 수 있는 키워드는 보안정책에 따라 결정된다. 유효한 키워드로는euid, uid, egid, gid등 4개가 있다.
euid 와 uid는 단일 사용자이름이나 숫자로된 사용자 ID를 포함한다. euid를 지정하는 명령어는 지정된 real UID값과 함께 실행된다. 이것은 실행파일에 setgid 값을 설정하는것과 비슷한 과정이다. gid를 지정하는 명령어는 real GID 및 effective GID와 함께 실행된다.
예)
All:suser:cmd:::*:
Printer Management:suser:cmd:::/usr/bin/cancel:euid=0
Printer Management:suser:cmd:::/usr/bin/lpset:egid=14
Printer Management:suser:cmd:::/usr/lib/lp/enable:euid=lp
Printer Management:suser:cmd:::/usr/sbin/lpusers:euid=lp
RBAC를 운영하는데 필요한 유틸리티
auths : 사용자의 위임권한을 표시해줌.
profiles : 특정 사용자에 대한 profile을 보여줌.
roles : 사용자에게 부여한 권한을 보여줌.
pfexec : profile shell, exec_attr DB안에 명시된 명령어를 속성과 함께 실행시킴.
policy.conf : 보안정책을 configuring 해준 파일. 부여한 권한을 나열.
Roleadd: 시스템 상에 role account 추가
Rolemod: role의 login 정보 수정
Useradd: 시스템 상의 user accout 추가
< lab>
<Creating User and a Role >
1. 하나의 role을 만든다.
# roleadd ?u 1000 ?g 10 ?d /export/home/roler ?m roler
# passwd roler
2. create the profile
# vi /etc/security/prof_attr
Shut:::Able to shutdown the system:
3. role에 profile 추가
# rolemod ?P Shut,All roler
4. /etc/user_attr이 변경되었는지 확인
# more /etc/user_attr
5. user accout를 한명 추가한다.
# useradd ?u 1000 ?g 10 ?d /export/home/user01 ?m ?s /bin/ksh ?R role user01
# passwd user01
# more /etc/passwd /etc/user_attr
6. profile에 실제 수행시킬 command를 할당한다.
# vi /etc/security/exec_attr
< testing the configuration>
user01로 로긴한다.
Login : user01
Passwd:*******
원하는 role user로 switch user 한다
# su ? roler
3. root만 수행할 수 있는 다음 명령어를 수행해본다
Shut:suser:cmd:::/usr/sbin/shutdown:uid=0
$ /usr/sbin/shutdown ?i 6 ?g 0
移