출처 :  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를 사용할 수 있다. 이에 대해서는 뒤에서 설명하겠다.




  • 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


위 출력 결과에서, 사용자 pinkywasgrpwebsp sugroup을 가진 것을 알 수 있다.
그 다음, wasgrpwebsp sugroup의 구성원을 나열하려면 다음 코드를 사용한다.

# lsgroup -a users wasgrp
admin users=dxtans,pxcon,jgena
# lsgroup -a users websp
admin users=dcand,


이제 우리는 사용자 pinkywasgrpwebsp라는 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






Sugroup 사용


Sugroup의 구현 방법을 보여주는 예제를 살펴보자.
# 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.


사용자 papadxtans 계정에 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만 수행하도록 허용하는 것이 좋다.


# 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 항목의 기본 스탠자에는 어떤 이름이든 넣을 수 있다. 따라서 새 사용자를 생성할 때, AIX에서는 /etc/group에서 그룹 이름이 실제로 유효한지 검사하지 않고 이 값을 얻을 것이다. 하지만, 이름 길이와 유효한 문자에 관해서는 일반적인 제한사항이 적용된다. 사용자 sugroup 항목이 smit 또는 chuser를 통해 수정되고 존재하지 않는 이 그룹 이름 값을 사용하려고 하면, /etc/group에 대한 검사가 이루어지면서 명령에 실패하게 된다.

새 사용자가 모두 생성될 때, 기본적으로 그 sugroup 세트를 가지게 되고 누구도 그 사용자에게 su 액세스할 수 없다. 자신의 sugroup을 기본값인 ALL로 이미 설정한 모든 사용자는 이제 자신의 sugroup 속성이 'none'이 된다. 그러면 보안 정책 요구에 따라 그 사용자의 보안 레벨을 점진적으로 올릴 수 있다.

!<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라는 계정이 있다고 가정하자. firecloud 그룹에 속하는 사용자는 사용자 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


이제 누가 cloudfire 그룹에 속하고, 사용자 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,kiloukflag 계정에 대한 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

 

목록 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


'::: 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

+ Recent posts