출처 : http://www.ibm.com/developerworks/kr/aix/library/au-sugroup/index.html
시스템 관리자는 sugroup을 사용하여 누가 어떤 계정에 su 액세스할 수 있는지에 관해 그룹 구성원을 기준으로 액세스를 제한할 수 있다. NOT 연산자를 사용하면 액세스 제어를 추가로 제한할 수 있다. 감사 목적으로 누가 어떤 sugroup의 구성원인지, 어떤 계정에 su 액세스할 수 있는지에 관한 보고를 식별할 필요가 있다. 이를 위해서는 sugroup 구성원 액세스에 대한 보고서를 생성해야 하며, 이는 일반적으로 준수 태스크로 간주된다.
Sugroup 개요
사용자에게 su 액세스 권한을 제공하는 시스템 관리자는 사용자가 현재 계정에서 로그아웃하지 않고 다른 사용자로 전환하거나 다른 사용자를 대신할 수 있는 능력을 제공하는 것이다. 일반적으로, su 계정은 사용자가 다른 계정, 예컨대 루트 사용자 또는 애플리케이션 소유자로 임시로 전환할 수 있도록 하는 설정이다. 하지만, 애플리케이션 지원 증가에 따라 시스템 관리에 필요한 유지보수 오버헤드도 증가한다. 수많은 개인 사용자가 아니라 그룹 단위로 관리하므로, sugroup을 사용하면 su 사용 권한을 더 효율적으로 관리할 수 있다.
시스템 관리자는 sugroup을 사용하여 특정 사용자들을 그룹으로 분류하고 그들에게 각기 다른 계정에 su 액세스하는 권한을 부여할 수 있다. 실제 su 액세스는 특정 AIX® 그룹의 구성원이 됨으로써 제어된다. 사용자가 생성되면 사용자 속성의 일부로서 sugroup을 지정할 수 있고, 이 그룹의 구성원만이 그 사용자에 대해 su 액세스할 수 있도록 허용된다. 물론, su 액세스를 하는 사용자는 비밀번호를 알아야 올바로 su 액세스할 수 있다. 어떤 사용자의 비밀번호를 알지만 지정된 sugroup에 속하지 않는 다른 사용자는 알맞은 sugroup에 속하지 않으므로 그 사용자에게 su 액세스할 수 없다.
AIX 내에서는 sugroup을 사용할 때 "ALL"이라는 단어는 예약어로서 모든 그룹을 의미한다.
앞서 설명했듯이, 어떤 시스템에서는 다른 사용자에게 비밀번호를 알려주는 것이 보안 정책에 위배되지 않을 수도 있다. 그런 경우에는 sudo를 사용할 수 있다. 이에 대해서는 뒤에서 설명하겠다.
알아야 할 명령
어떤 sugroup이 설정되어 있는지 확인할 때 유용하게 사용할 수 있는 다음 두 가지 명령이 있다.
lsuser
lsgroup
다음 예제에서는 lsuser
명령을 사용하여 모든 사용자의 모든 sugroup을 출력한다. 해당 시스템에서 구성된 사용자 수에 따라 이 목록이 상당히 길 수도 있다.
# lsuser -a sugroups ALL |
사용자가 생성되었는데 아무런 sugroup도 지정되지 않을 때, AIX에서는 기본적으로 ALL로 설정된다. 즉, 어떤 그룹에서든 그 사용자에 대해 su 액세스할 수 있다는 뜻이다. 기본값이 ALL을 필터링하려면 'grep -v
'를 사용하여 기본값이 ALL 속성이 설정되지 않은 sugroup을 가진 모든 사용자를 나열한다. 다음 위치에서 ALL의 시스템에 대한 기본 sugroup으로 바꾼다.
/etc/security/user: # lsuser -a sugroups ALL|grep -v ALL |
Sugroup 속성을 가진 단일 사용자(이 경우에는 사용자 pinky
)를 나열하려면 다음 코드를 사용한다.
# lsuser -a sugroups pinky pinky sugroups=wasgrp,websp |
위 출력 결과에서, 사용자 pinky
가 wasgrp
및 websp
sugroup을 가진 것을 알 수 있다.
그 다음, wasgrp
및 websp
sugroup의 구성원을 나열하려면 다음 코드를 사용한다.
# lsgroup -a users wasgrp admin users=dxtans,pxcon,jgena # lsgroup -a users websp admin users=dcand, |
이제 우리는 사용자 pinky
가 wasgrp
및 websp
라는 sugroup을 가지고 있고, 사용자 pinky
에 대해 su 액세스가 허용되는 그룹의 구성원은 다음과 같음을 알고 있다.
dxtans,pxcon,jgena,dcand |
grep
유틸리티를 사용하여 파일에서 시스템 사용자 속성 기본값을 검색할 수 있다. 파일에서 주석의 배치에 따라, 다음 중 하나가 기본 스탠자를 정확히 추출할 것이다.
grep -p "default:" /etc/security/user grep -v ^"*" /etc/security/user| grep -p "default:" |
또는 다음과 같이 기본 스탠자에서 sugroup에 대해 grep을 수행한다.
# grep -p "default:" /etc/security/user| grep sugroups sugroups = ALL |
# lsuser -a sugroups dxtans dxtans sugroups=ALL |
Sugroup 속성이 ALL로 설정되어 있는 이전 출력 결과에서 그 방법을 확인할 수 있다. 즉, 어떤 사용자나 그룹 구성원도 사용자 dxtans
의 비밀번호를 알고 있다면 dxtans
의 계정에 su 액세스할 수 있다. 이제, 그룹 smoke
만 포함하도록 sugroup 속성을 변경해보자.
# chuser sugroups=smoke dxtans # lsuser -a sugroups dxtans dxtans sugroups=smoke |
그룹 smoke
의 구성원을 살펴보면, papa
라는 한 구성원만 있다.
# lsgroup -a users smoke smoke users=papa |
그룹 smoke
의 구성원이 아닌 다른 사용자가 su 액세스를 시도하면 다음과 같은 일이 생긴다.
$ whoami bravo $ su – dxtans dxtans's Password: 3004-307 You are not allowed to su to this account. 3004-501 Cannot su to "dxtans" : Account is not accessible. |
사용자 papa
가 dxtans
계정에 su 액세스를 시도하고 비밀번호를 알고 있는 경우, 액세스 권한이 주어진다.
$ whoami papa $ su - dxtans dxtans's Password: $ id uid=203(dxtans) gid=1(staff) |
Su 액세스 시도는 /var/adm/sulog
에 로그로 기록된다.
앞서 보여준 su 액세스 시도 데모를 사용할 때 두 가지 항목이 있다. 덧셈 기호(+)는 사용자 papa
에서 사용자 dxtans
로 이루어진 su 액세스 시도에 성공했음을 나타낸다. 뺄셈 기호(-)는 사용자 bravo
에서 사용자 dxtans
로 이루어진 su 액세스 시도에 실패했음을 나타낸다.
$ tail /var/adm/sulog SU 04/17 19:51 + pts/1 papa-dxtans SU 04/17 19:52 - pts/1 bravo-dxtans |
어떤 사용자가 다른 사용자에게 su 액세스를 시도하다가 'Account is not accessible' 메시지를 받았는데 sugroup 또는 su를 통한 인증이 올바르다고 확신하는 경우에는 대상 사용자가 규칙을 위반하여 실패한 로그인 시도를 하지 않았는지 확인한다. 아마 비밀번호가 만료되었거나 최초 비밀번호가 설정되지 않았을 것이다.
모든 시스템의 필수 sugroup
지금까지 필자가 설명한 내용으로 수많은 su 사용 권한을 개별적으로 작성하는 것보다는 sugroup을 작성하는 것이 훨씬 나은 이유가 잘 설명되었기를 바란다. Sugroup을 사용하는 방법을 채택하지 않더라도, 루트 계정에 대한 su 액세스 관리를 위해 최소한 하나 이상의 sugroup을 작성하자. 일반적으로, 시스템 관리자들은 자신의 계정으로 로그인한 다음 루트에 su 액세스한다. 이제, 어떻게 시스템 관리자인 다음 사용자들만 루트에 su 액세스가 허용되는지 보여주겠다. 여기서 사용자는 다음과 같다.
john,peter,jane |
첫 번째 태스크는 sysadmin
이라는 그룹을 작성하는 것으로서, 그 구성원은 위에 나열되어 있다. 이 그룹의 구성원들만 루트에 su 액세스하도록 허용된다.
john,peter,jane
이라는 구성원이 있는 그룹을 작성한다.
# mkgroup -A users="john,peter,jane" sysadmin |
그룹 구성원을 확인한다.
# lsgroup -a users sysadmin sysadmin users=john,peter,jane |
사용자에게 sugroup sysadmin
의 루트 권한을 준다.
# chuser sugroups=sysadmin root # lsuser -a sugroups root root sugroups=sysadmin |
그러면 sysadmin
의 구성원만이 루트에 su 액세스할 수 있다.
루트 사용자가 Telnet을 통해 직접 로그인하도록 허용하면 안 된다. 루트 사용자는 직접 콘솔을 통해서만 로그인하도록 허용해야 한다. 이때, ssh를 사용한다면 업데이트 및 파일/스크립트 롤아웃을 다룰 때 시스템 사이에서 ssh에 대한 루트 액세스를 사용하는 것이 바람직할 수 있다. 루트 사용자는 배포 서버에서 ssh out만 수행하도록 허용하는 것이 좋다.
최초 거부
이 사용자에 대한 su 액세스를 할 수 있는 사용자의 액세스를 금지하려는 새 사용자를 시스템에서 생성하는 경우가 있을 수 있다. 이를 수행하는 한 가지 방법은 구성원이 없는 그룹을 작성하는 것이다. 그러면 그 그룹(그룹 이름)을 그 사용자에 대한 sugroup 속성으로 사용할 수 있다. 예를 들어, brown
이라는 사용자가 있다고 가정해보자. 사용자 환경의 민감한 특성 때문에, (루트 사용자를 제외한) 누구도 그 계정에 su 액세스할 수 있어서는 안 된다. 다음과 같이 구성원이 없는 none
이라는 그룹을 작성할 수 있을 것이다.
# mkgroup -A none # lsgroup -a users none none users= |
그런 다음, 그 그룹을 포함하도록 사용자 계정 sugroup 속성을 변경한다.
# chuser sugroups=none brown # lsuser -a sugroups brown brown sugroups=none |
누구도 none
그룹에 속하지 않고 이 그룹을 sugroup으로 사용할 것이므로, 일반 사용자는 사용자 brown
의 계정에 su 액세스할 수 없다.
이를 더욱 영구적인 기능으로 만들려면 /etc/security/user
파일을 편집하면 된다. Sugroup 항목의 기본 스탠자 내에 방금 작성한 그 그룹을 넣는다.
sugroups = none |
Sugroup 제한
앞서 설명한 바와 같이, 기본 sugroup 값을 변경하지 않으면 모든 사용자가 기본값인 ALL을 사용할 것이다. AIX에서는 sugroup 액세스를 더욱 제한하기 위해 NOT 연산자 '!'를 제공한다. 규칙의 형식은 다음과 같다.
!<group_name > |
Sugroup 속성에서 이 규칙을 적용하면 그룹 이름 앞에 NOT 연산자가 있는 그룹 이름에 대해서는 그 계정으로의 su 액세스가 거부된다. 그러면 "왜?"라는 질문이 자연스럽게 나올 수 있다. 보통 사용자의 경우, 어떤 사용자들에 대한 su 액세스가 거부되는 그룹을 기준으로 지정할 수 있다. 또한, 임시로 어떤 그룹을 제한하여 이 방법을 사용할 수도 있다. 그러면 다른 계정에 대한 액세스를 제어하거나 충족시키기 위해 많은 그룹을 작성하지 않아도 되므로 su 관리의 유연성이 향상된다.
NOT 연산자를 사용하는 sugroup이 얼마나 효과적일 수 있는지 보여주는 예제를 살펴보자. sun
이라는 그룹이 있다고 가정하자. 다음 lsgroup
의 출력 결과로부터 해당 그룹의 사용자를 결정할 수 있다.
# lsgroup -a users sun sun users=alpha,bravo |
따라서 구성원은 다음과 같다.
alpha,bravo |
모든 사용자가 사용자 charlie
에게 su 액세스할 수 있도록 허용하되, sun
그룹의 구성원에 대한 액세스는 거부하려면,
다음 명령을 사용한다.
# chuser sugroups="!sun,ALL" charlie |
위 명령에서 NOT 연산자의 순서에 주목하자. 우선 거부한 다음에 허용한다.
다음 명령을 사용하면 위에서 말한 사용자들의 sugroup 및 그룹 속성이 나열된다.
alpha, bravo, charlie # lsuser -a sugroups groups alpha alpha sugroups=ALL groups=staff,sun # lsuser -a sugroups groups bravo bravo sugroups=ALL groups=staff,sun # lsuser -a sugroups groups charlie charlie sugroups=!sun,ALL groups=staff |
제한된 그룹 sun
의 구성원이 아닌 사용자 delta
가 사용자 charlie
에게 su 액세스를 시도하고 비밀번호를 알고 있다면,
인증에 성공할 것이다.
# lsuser -a sugroups groups delta delta sugroups=ALL groups=staff,water,fire,mobgrp |
사용자 delta
로서 다음 명령을 실행한다.
$ id uid=220(delta) gid=1(staff) groups=206(water),207(fire),215(mobgrp) $ su - charlie charlie's Password: $ id uid=211(charlie) gid=1(staff) |
제한된 그룹 sun
의 구성원인 사용자 alpha
가 사용자 charlie
에 대한 su 액세스를 시도하는 경우, alpha는 액세스가 거부될 것이다.
사용자 alpha
로서 다음 명령을 실행한다.
$ id uid=209(alpha) gid=1(staff) groups=214(sun) $ su - charlie charlie's Password: 3004-307 You are not allowed to su to this account. 3004-501 Cannot su to "charlie" : Account is not accessible. |
왜 우리가 NOT 연산자를 사용해도 되는지를 보여주는 다른 예제를 살펴보자. ukflag
라는 계정이 있다고 가정하자. fire
및 cloud
그룹에 속하는 사용자는 사용자 ukflag
에 대해 su 액세스할 수 없도록 하고, earth
의 구성원만 액세스가 허용되어야 한다. 우선, 사용자 ukflag
sugroup 속성을 변경한 다음 변경 내용을 확인한다.
# chuser sugroups="!fire,!cloud,earth" ukflag # lsuser -a sugroups ukflag ukflag sugroups=!fire,!cloud,earth |
earth
그룹의 구성원은 사용자 ukflag
에 대한 su 액세스가 허용될 것이다.
# lsgroup -a users earth earth users=zulu |
이제 누가 cloud
및 fire
그룹에 속하고, 사용자 ukflag
에 대한 su 액세스를 제한할 사용자는 누구인지 살펴보자.
# lsgroup -a users fire fire users=plutt,echoa,golf,hotel,india,juliet,kilo # lsgroup -a users cloud cloud users=hotel,india |
lsgroup
출력 결과에서 사용자 zulu
만이 ukflag
에 대한 su 액세스가 허용될 것이라는 점을 알 수 있다. 또한, lsgroup
출력 결과에서 사용자 plutt,echoa,golf,hotel,india,juliet,kilo
가 ukflag
계정에 대한 su 액세스가 거부될 것이라는 점도 알 수 있다.
이 점은 fire
그룹의 구성원인 사용자 plutt
의 계정에서 보여줄 수 있다.
$ id uid=230(plutt) gid=1(staff) groups=206(water),207(fire) $ su - ukflag ukflag's Password: 3004-307 You are not allowed to su to this account. 3004-501 Cannot su to "ukflag" : Account is not accessible. |
earth 그룹의 구성원인 사용자 zulu
가 다음 명령을 실행한다.
$ id uid=228(zulu) gid=1(staff) groups=209(earth) $ su - ukflag ukflag's Password: $ |
여기서 보여준 바와 같이, NOT 연산자를 사용하면 su에 액세스할 수 있는 sugroup을 통해 사용자 계정에 대한 액세스를 미세 조정할 수 있다.
비밀번호 불필요
Su 액세스 권한을 제공할 때, 다른 사용자들이 su 액세스가 허용되는 계정의 비밀번호를 알 수 있게 하는 것은 적절치 못할 수 있다. 특히, 지원 사용자가 문제 해결을 위해 액세스 권한을 받을 필요가 있을 때 애플리케이션 계정에 대해 더욱 그러하다고 할 수 있다. Sudo를 사용하면 이런 사용자들이 su 액세스가 허용되는 계정의 비밀번호를 몰라도 정식으로 액세스하도록 할 수 있다.
지원 사용자 alpha, bravo,charlie
가 있고, 이들이 모두 app_supp
그룹에 속한다고 생각해보자. 이런 사용자들의 책임 중에 프로덕션 환경 계정인 ukflag
에 대한 액세스 권한을 얻어야 할 책임이 있다. 간단히 /etc/sudoers
파일을 편집하고 다음 항목을 넣어 rs6000을 호스트 이름으로 바꾼다.
%app_supp rs6000 = NOPASSWD:/usr/bin/su – ukflag |
그룹 구성원을 확인한다.
# lsgroup -a users app_supp app_supp users=alpha,bravo,charlie |
사용자가 ukflag
계정에 대해 sudo를 통해 su 액세스할 수 있는지 확인한다.
$ whoami alpha $ sudo -l User alpha may run the following commands on this host: (root) NOPASSWD: /usr/bin/su - ukflag $ sudo -u root su - ukflag $ whoami ukflag |
Sudo에 su 항목이 많을 수 있으므로, 다음과 같이 각각의 su 항목을 쉼표로 구분해야 한다.
%app_supp rs6000 = NOPASSWD:/usr/bin/su – ukflag, /usr/bin/su – ieflag, /usr/bin/su - plflag |
Sugroup에 대한 보고
Sugroup을 사용할 때 현재 가지고 있는 모든 sugroup 액세스 권한을 검토하는 작업은 때때로 시간이 많이 걸릴 수 있고, 특히 많은 시스템을 다루는 경우에는 더욱 그러하다. Sugroup과 구성원들의 스냅샷을 생성하는 스크립트를 작성하는 것이 유리할 수 있다. 목록 1에서 필자는 준비된 sugroup의 개요를 제공할 스크립트를 제시한다. 이 스크립트는 원래는 두 개의 스크립트였지만, 데모용으로 이 둘을 한 스크립트로 병합했다. 이 스크립트는 "알아야 할 명령" 섹션에서 사용된 명령을 토대로 한 것이다.
이 스크립트를 실행하면 sugroup 속성의 일부로서 ALL을 가지고 있지 않은 사용자가 모두 표시된다. 그런 다음, 사용자와 그 사용자의 sugroup이 나열된다. 이 스크립트의 두 번째 파트에서는 각각의 sugroup과 개별 sugroup의 구성원을 표시한다.
목록 1. su_rep1
#!/bin/sh # su_rep1 list=$(cat /etc/passwd| awk -F: '{print $1}' | sort) echo "user su groups *(Denied su access) =========================================" # # display user and sugroups for loop in $list do sugrp=$(lsuser -a sugroups $loop | sed s/ALL//g | awk -F= '{print $2}'|sed 's/,/ /g') if [ "$sugrp" != "" ] then sugrp=$(echo $sugrp|sed 's/!/*/g') printf "%-10s %-40s\n" "$loop" "$sugrp" fi done # # list sugroups and members echo "\nsugroup sugroup members ==========================" sugrp_list=$(lsuser -a sugroups ALL| sed s/ALL//g | awk -F= '{print $2}'| tr " " "\n" \ |sed 's/,/ /g' | sed 's/!//g'|tr " " "\n" |awk '!array [$0]++') for loop in $sugrp_list do sugrp_list=$(lsgroup -a users $loop | awk -F= '{print $2}') if [ "$sugrp_list" = "" ] then sugrp_list=" -- No Members --" fi printf "%-10s %-40s\n" "$loop" "$sugrp_list" done |
목록 1의 su_rep1 실행 시, 필자의 시스템에서는 다음과 유사한 결과가 출력된다.
user su groups *(Denied su access) ========================================= charlie *sun dxtans smoke papa syb root admin sysadmin ukflag *fire *cloud earth xray water earth *smoke zulu fire sugroup sugroup members ========================== admin dxtans sysadmin john,peter,jane smoke papa sun alpha,bravo water delta,echoa,golf,plutt earth zulu fire delta,echoa,golf,hotel,india,juliet,kilo,plutt syb wwpdpga1,wwpdclt2,ukflag cloud hotel,india,spoll |
결론
시스템 관리자는 Sugroup을 사용하여 그룹 멤버십을 기준으로 개별 사용자 계정에 대한 액세스를 제어할 수 있다. Sugroup에서는 시스템에 대한 보안 정책을 구현하고 관리하는 한 가지 방법을 제공한다. 감사를 받을 때 감사자에게 일반 계정과 애플리케이션/시스템 계정 간의 액세스 제어와 sugroup 보안 모니터링 방법을 입증해야 한다. 본 기사에서는 sugroup의 구현 방법을 설명했다. 또한, sugroup 액세스 권한을 표시하기 위한 스크립트도 제공되었다.
'::: OS ::: > AIX' 카테고리의 다른 글
Fast Paths for SMIT Tasks (0) | 2011.09.15 |
---|---|
lsof 사용법 (0) | 2011.08.31 |
AIX 5.3 환경에 lsof 유틸 설치하기 (0) | 2011.05.16 |
AIX 이더채널 구성방법 (1) | 2011.05.09 |
AIX - Nmon Command (0) | 2011.04.28 |